Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c44ba9f6 authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

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: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent b6727b12
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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;