diff options
Diffstat (limited to 'net/rsync/patches/006-handle-archaic-checksums-properly.patch')
-rw-r--r-- | net/rsync/patches/006-handle-archaic-checksums-properly.patch | 100 |
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); |