Make sure an alternate --inplace sum has the right length
[rsync/rsync.git] / match.c
diff --git a/match.c b/match.c
index 229c9dd..407387f 100644 (file)
--- a/match.c
+++ b/match.c
@@ -91,8 +91,7 @@ static void build_hash_table(struct sum_struct *s)
 static OFF_T last_match;
 
 
-/**
- * Transmit a literal and/or match token.
+/* Transmit a literal and/or match token.
  *
  * This delightfully-named function is called either when we find a
  * match and need to transmit all the unmatched data leading up to it,
@@ -100,9 +99,9 @@ static OFF_T last_match;
  * transmit it.  As a result of this second case, it is called even if
  * we have not matched at all!
  *
- * @param i If >0, the number of a matched token.  If 0, indicates we
- * have only literal data.
- **/
+ * If i >= 0, the number of a matched token.  If < 0, indicates we have
+ * only literal data.  A -1 will send a 0-token-int too, and a -2 sends
+ * only literal data, w/o any token-int. */
 static void matched(int f, struct sum_struct *s, struct map_struct *buf,
                    OFF_T offset, int32 i)
 {
@@ -235,7 +234,7 @@ static void hash_search(int f,struct sum_struct *s,
                         * one with an identical offset, so we prefer that over
                         * the adjacent want_i optimization. */
                        if (updating_basis_file) {
-                               /* All the sender's chunks start at blength boundaries. */
+                               /* All the generator's chunks start at blength boundaries. */
                                while (aligned_offset < offset)
                                        aligned_offset += s->blength;
                                if (offset == aligned_offset) {
@@ -245,14 +244,15 @@ static void hash_search(int f,struct sum_struct *s,
                                                        continue;
                                                if (i2 != i) {
                                                        if (sum != s->sums[i2].sum1
+                                                        || l != s->sums[i2].len
                                                         || memcmp(sum2, s->sums[i2].sum2, s->s2length) != 0)
                                                                break;
                                                        i = i2;
                                                }
-                                               /* This chunk was at the same offset on
-                                                * both the sender and the receiver. */
+                                               /* This chunk remained in the same spot in the old and new file. */
                                                s->sums[i].flags |= SUMFLG_SAME_OFFSET;
                                                want_i = i;
+                                               break;
                                        }
                                }
                        }