aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2022-10-03 23:10:41 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2022-11-11 18:18:53 +0000
commit44c1914ee672487fe19363647f787958f2e3bebb (patch)
tree7d2bd731e3a3e4db62dfe747ca5608b5b6e6f704
parent991603548ecb2549d074217d70a1f0f96e6c70f6 (diff)
downloadsrc-44c1914ee672487fe19363647f787958f2e3bebb.tar.gz
src-44c1914ee672487fe19363647f787958f2e3bebb.zip
powerpc_nvram: Fix a bug in the adler32 checksum.
The Adler32 digest consists of two 16-bit words whose values are calculated modulo 65521 (largest prime < 2^16). To avoid two division instructions per byte, this version copies an optimization found in zlib which defers the modulus until close to the point that the intermediate sums can overflow 2^32. (zlib uses NMAX == 5552 for this, this version uses 5000) The bug is that in the deferred modulus case, the modulus was only applied to the high word (and twice at that) but not to the low word. The fix is to apply it to both words. Reviewed by: jhibbits Reported by: Miod Vallat <miod@openbsd.org> Differential Revision: https://reviews.freebsd.org/D36798 (cherry picked from commit e0df0dce71d86796195502b923243bb6bacdcdc2)
-rw-r--r--sys/dev/powermac_nvram/powermac_nvram.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/dev/powermac_nvram/powermac_nvram.c b/sys/dev/powermac_nvram/powermac_nvram.c
index 7c6c4d2bc8a1..bce511463d38 100644
--- a/sys/dev/powermac_nvram/powermac_nvram.c
+++ b/sys/dev/powermac_nvram/powermac_nvram.c
@@ -362,7 +362,7 @@ adler_checksum(uint8_t *data, int len)
high = 0;
for (i = 0; i < len; i++) {
if ((i % 5000) == 0) {
- high %= 65521UL;
+ low %= 65521UL;
high %= 65521UL;
}
low += data[i];