summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2009-06-23 21:22:58 +0200
committerArnd Bergmann <arnd@arndb.de>2009-11-03 16:06:52 +0100
commitc44ba9f6684946b156335da6a6d55f0b8cf7cb72 (patch)
tree8a24ba039b08fc8bb95a670e33ef7312443576da
parentb6727b12dd2ffb4a890eb5b13a298230c29ba45d (diff)
downloadlwn-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.c8
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;