diff options
author | Arnd Bergmann <arnd@arndb.de> | 2009-06-23 21:22:58 +0200 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2009-11-03 16:06:52 +0100 |
commit | c44ba9f6684946b156335da6a6d55f0b8cf7cb72 (patch) | |
tree | 8a24ba039b08fc8bb95a670e33ef7312443576da | |
parent | b6727b12dd2ffb4a890eb5b13a298230c29ba45d (diff) | |
download | lwn-c44ba9f6684946b156335da6a6d55f0b8cf7cb72.tar.gz lwn-c44ba9f6684946b156335da6a6d55f0b8cf7cb72.zip |
lib/checksum.c: use 32-bit arithmetic consistently
The use of 'unsigned long' variables in the 32-bit part of do_csum()
is confusing at best, and potentially broken for long input on 64-bit
machines.
This changes the code to use 'unsigned int' instead, which makes
the code behave in the same (correct) way on both 32 and 64 bit
machines.
Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-rw-r--r-- | lib/checksum.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/lib/checksum.c b/lib/checksum.c index b2e2fd468461..886b48db4f28 100644 --- a/lib/checksum.c +++ b/lib/checksum.c @@ -37,7 +37,7 @@ #include <asm/byteorder.h> -static inline unsigned short from32to16(unsigned long x) +static inline unsigned short from32to16(unsigned int x) { /* add up 16-bit and 16-bit for 16+c bit */ x = (x & 0xffff) + (x >> 16); @@ -49,7 +49,7 @@ static inline unsigned short from32to16(unsigned long x) static unsigned int do_csum(const unsigned char *buff, int len) { int odd, count; - unsigned long result = 0; + unsigned int result = 0; if (len <= 0) goto out; @@ -73,9 +73,9 @@ static unsigned int do_csum(const unsigned char *buff, int len) } count >>= 1; /* nr of 32-bit words.. */ if (count) { - unsigned long carry = 0; + unsigned int carry = 0; do { - unsigned long w = *(unsigned int *) buff; + unsigned int w = *(unsigned int *) buff; count--; buff += 4; result += carry; |