commit 7b8a4ecd6ff9cdf4e5d3850ebf822f1e989255b3 Author: Wayne Davison 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);