--- embedaddon/rsync/checksum.c 2013/10/14 07:51:14 1.1.1.2 +++ embedaddon/rsync/checksum.c 2016/11/01 09:54:32 1.1.1.3 @@ -3,7 +3,7 @@ * * Copyright (C) 1996 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2004-2013 Wayne Davison + * Copyright (C) 2004-2015 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ extern int checksum_seed; extern int protocol_version; +extern int proper_seed_order; /* a simple 32 bit checksum that can be upadted from either end @@ -54,10 +55,18 @@ void get_checksum2(char *buf, int32 len, char *sum) if (protocol_version >= 30) { uchar seedbuf[4]; md5_begin(&m); - md5_update(&m, (uchar *)buf, len); - if (checksum_seed) { - SIVALu(seedbuf, 0, checksum_seed); - md5_update(&m, seedbuf, 4); + if (proper_seed_order) { + if (checksum_seed) { + SIVALu(seedbuf, 0, checksum_seed); + md5_update(&m, seedbuf, 4); + } + md5_update(&m, (uchar *)buf, len); + } else { + md5_update(&m, (uchar *)buf, len); + if (checksum_seed) { + SIVALu(seedbuf, 0, checksum_seed); + md5_update(&m, seedbuf, 4); + } } md5_result(&m, (uchar *)sum); } else { @@ -98,10 +107,10 @@ void get_checksum2(char *buf, int32 len, char *sum) } } -void file_checksum(char *fname, char *sum, OFF_T size) +void file_checksum(const char *fname, const STRUCT_STAT *st_p, char *sum) { struct map_struct *buf; - OFF_T i, len = size; + OFF_T i, len = st_p->st_size; md_context m; int32 remainder; int fd; @@ -112,7 +121,7 @@ void file_checksum(char *fname, char *sum, OFF_T size) if (fd == -1) return; - buf = map_file(fd, size, MAX_MAP_SIZE, CSUM_CHUNK); + buf = map_file(fd, len, MAX_MAP_SIZE, CSUM_CHUNK); if (protocol_version >= 30) { md5_begin(&m);