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

Commit 32a9ff9c authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

lib/checksum.c: fix endianess bug



The new generic checksum code has a small dependency on endianess and
worked only on big-endian systems. I could not find a nice efficient
way to express this, so I added an #ifdef. Using
'result += le16_to_cpu(*buff);' would have worked as well, but
would be slightly less efficient on big-endian systems and IMHO
would not be clearer.

Also fix a bug that prevents this from working on 64-bit machines.
If you have a 64-bit CPU and want to use the generic checksum
code, you should probably do some more optimizations anyway, but
at least the code should not break.

Reported-by: default avatarMike Frysinger <vapier@gentoo.org>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent fcec9bf1
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -55,7 +55,11 @@ static unsigned int do_csum(const unsigned char *buff, int len)
		goto out;
	odd = 1 & (unsigned long) buff;
	if (odd) {
#ifdef __LITTLE_ENDIAN
		result = *buff;
#else
		result += (*buff << 8);
#endif
		len--;
		buff++;
	}
@@ -71,7 +75,7 @@ static unsigned int do_csum(const unsigned char *buff, int len)
		if (count) {
			unsigned long carry = 0;
			do {
				unsigned long w = *(unsigned long *) buff;
				unsigned long w = *(unsigned int *) buff;
				count--;
				buff += 4;
				result += carry;
@@ -87,7 +91,11 @@ static unsigned int do_csum(const unsigned char *buff, int len)
		}
	}
	if (len & 1)
#ifdef __LITTLE_ENDIAN
		result += *buff;
#else
		result += (*buff << 8);
#endif
	result = from32to16(result);
	if (odd)
		result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);