From 9c3e4ad1ab26707cf462e6ceae739ec4b5f2fb9d Mon Sep 17 00:00:00 2001 From: Ian Abbott Date: Thu, 7 Jul 2011 01:18:49 +0000 Subject: [PATCH] --- yaml --- r: 256151 b: refs/heads/master c: be0e1e788b0973147b6b83cc940676cc26009eb7 h: refs/heads/master i: 256149: 31724d2ade1955c2eb75d90abba044efab845520 256147: 08b94f79f239ba4e5d5111e4cd554075ec43bbb3 256143: 5156b8a2cb3c82088f2328d3efc97dbd34cd7cd8 v: v3 --- [refs] | 2 +- trunk/lib/checksum.c | 13 +++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 0042b66cb5d6..232b0706ecef 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 97bc3633bec7ed0fdfbda6b9cf86c51e4f58f8e2 +refs/heads/master: be0e1e788b0973147b6b83cc940676cc26009eb7 diff --git a/trunk/lib/checksum.c b/trunk/lib/checksum.c index 097508732f34..8df2f91e6d98 100644 --- a/trunk/lib/checksum.c +++ b/trunk/lib/checksum.c @@ -49,7 +49,7 @@ static inline unsigned short from32to16(unsigned int x) static unsigned int do_csum(const unsigned char *buff, int len) { - int odd, count; + int odd; unsigned int result = 0; if (len <= 0) @@ -64,25 +64,22 @@ static unsigned int do_csum(const unsigned char *buff, int len) len--; buff++; } - count = len >> 1; /* nr of 16-bit words.. */ - if (count) { + if (len >= 2) { if (2 & (unsigned long) buff) { result += *(unsigned short *) buff; - count--; len -= 2; buff += 2; } - count >>= 1; /* nr of 32-bit words.. */ - if (count) { + if (len >= 4) { + const unsigned char *end = buff + ((unsigned)len & ~3); unsigned int carry = 0; do { unsigned int w = *(unsigned int *) buff; - count--; buff += 4; result += carry; result += w; carry = (w > result); - } while (count); + } while (buff < end); result += carry; result = (result & 0xffff) + (result >> 16); }