aboutsummaryrefslogtreecommitdiff
path: root/net/rsync/patches/006-handle-archaic-checksums-properly.patch
diff options
context:
space:
mode:
Diffstat (limited to 'net/rsync/patches/006-handle-archaic-checksums-properly.patch')
-rw-r--r--net/rsync/patches/006-handle-archaic-checksums-properly.patch100
1 files changed, 100 insertions, 0 deletions
diff --git a/net/rsync/patches/006-handle-archaic-checksums-properly.patch b/net/rsync/patches/006-handle-archaic-checksums-properly.patch
new file mode 100644
index 000000000..81b7585b2
--- /dev/null
+++ b/net/rsync/patches/006-handle-archaic-checksums-properly.patch
@@ -0,0 +1,100 @@
+commit 7b8a4ecd6ff9cdf4e5d3850ebf822f1e989255b3
+Author: Wayne Davison <wayned@samba.org>
+Date: Tue Oct 24 15:40:37 2017 -0700
+
+ Handle archaic checksums properly.
+
+diff --git a/checksum.c b/checksum.c
+index 8b38833..9382694 100644
+--- a/checksum.c
++++ b/checksum.c
+@@ -27,7 +27,7 @@ extern int proper_seed_order;
+ extern char *checksum_choice;
+
+ #define CSUM_NONE 0
+-#define CSUM_ARCHAIC 1
++#define CSUM_MD4_ARCHAIC 1
+ #define CSUM_MD4_BUSTED 2
+ #define CSUM_MD4_OLD 3
+ #define CSUM_MD4 4
+@@ -60,7 +60,7 @@ int parse_csum_name(const char *name, int len)
+ return CSUM_MD4_OLD;
+ if (protocol_version >= 21)
+ return CSUM_MD4_BUSTED;
+- return CSUM_ARCHAIC;
++ return CSUM_MD4_ARCHAIC;
+ }
+ if (len == 3 && strncasecmp(name, "md4", 3) == 0)
+ return CSUM_MD4;
+@@ -78,7 +78,7 @@ int csum_len_for_type(int cst)
+ switch (cst) {
+ case CSUM_NONE:
+ return 1;
+- case CSUM_ARCHAIC:
++ case CSUM_MD4_ARCHAIC:
+ return 2;
+ case CSUM_MD4:
+ case CSUM_MD4_OLD:
+@@ -143,7 +143,8 @@ void get_checksum2(char *buf, int32 len, char *sum)
+ }
+ case CSUM_MD4:
+ case CSUM_MD4_OLD:
+- case CSUM_MD4_BUSTED: {
++ case CSUM_MD4_BUSTED:
++ case CSUM_MD4_ARCHAIC: {
+ int32 i;
+ static char *buf1;
+ static int32 len1;
+@@ -174,7 +175,7 @@ void get_checksum2(char *buf, int32 len, char *sum)
+ * are multiples of 64. This is fixed by calling mdfour_update()
+ * even when there are no more bytes.
+ */
+- if (len - i > 0 || xfersum_type != CSUM_MD4_BUSTED)
++ if (len - i > 0 || xfersum_type > CSUM_MD4_BUSTED)
+ mdfour_update(&m, (uchar *)(buf1+i), len-i);
+
+ mdfour_result(&m, (uchar *)sum);
+@@ -217,6 +218,7 @@ void file_checksum(const char *fname, const STRUCT_STAT *st_p, char *sum)
+ case CSUM_MD4:
+ case CSUM_MD4_OLD:
+ case CSUM_MD4_BUSTED:
++ case CSUM_MD4_ARCHAIC:
+ mdfour_begin(&m);
+
+ for (i = 0; i + CSUM_CHUNK <= len; i += CSUM_CHUNK) {
+@@ -229,7 +231,7 @@ void file_checksum(const char *fname, const STRUCT_STAT *st_p, char *sum)
+ * are multiples of 64. This is fixed by calling mdfour_update()
+ * even when there are no more bytes. */
+ remainder = (int32)(len - i);
+- if (remainder > 0 || checksum_type != CSUM_MD4_BUSTED)
++ if (remainder > 0 || checksum_type > CSUM_MD4_BUSTED)
+ mdfour_update(&m, (uchar *)map_ptr(buf, i, remainder), remainder);
+
+ mdfour_result(&m, (uchar *)sum);
+@@ -265,6 +267,7 @@ void sum_init(int csum_type, int seed)
+ break;
+ case CSUM_MD4_OLD:
+ case CSUM_MD4_BUSTED:
++ case CSUM_MD4_ARCHAIC:
+ mdfour_begin(&md);
+ sumresidue = 0;
+ SIVAL(s, 0, seed);
+@@ -321,6 +324,10 @@ void sum_update(const char *p, int32 len)
+ }
+ }
+
++/* NOTE: all the callers of sum_end() pass in a pointer to a buffer that is
++ * MAX_DIGEST_LEN in size, so even if the csum-len is shorter that that (i.e.
++ * CSUM_MD4_ARCHAIC), we don't have to worry about limiting the data we write
++ * into the "sum" buffer. */
+ int sum_end(char *sum)
+ {
+ switch (cursum_type) {
+@@ -333,6 +340,7 @@ int sum_end(char *sum)
+ mdfour_result(&md, (uchar *)sum);
+ break;
+ case CSUM_MD4_BUSTED:
++ case CSUM_MD4_ARCHAIC:
+ if (sumresidue)
+ mdfour_update(&md, (uchar *)md.buffer, sumresidue);
+ mdfour_result(&md, (uchar *)sum);