Skip to content

Commit

Permalink
lib/checksum.c: use 32-bit arithmetic consistently
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Arnd Bergmann <[email protected]>
  • Loading branch information
arndb committed Nov 3, 2009
1 parent b6727b1 commit c44ba9f
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions lib/checksum.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit c44ba9f

Please sign in to comment.