summaryrefslogtreecommitdiff
path: root/sys/lib
diff options
context:
space:
mode:
authorTheo Buehler <tb@cvs.openbsd.org>2022-05-08 14:07:55 +0000
committerTheo Buehler <tb@cvs.openbsd.org>2022-05-08 14:07:55 +0000
commit5254884e488512d3edcb7d911b9286ef2e64a439 (patch)
treed4d868c4ef510afd7834f9bb85bbd04b4d1e669f /sys/lib
parenta6879c65031ca3d6489c694caadd955dc6cfe257 (diff)
Backport an upstream fix for CRC calculation. This fixes Java applications
on some older hardware, see https://github.com/madler/zlib/issues/613 Pointed out by tj and sthen commit ec3df00224d4b396e2ac6586ab5d25f673caa4c2 Author: Mark Adler <madler@alumni.caltech.edu> Date: Wed Mar 30 11:14:53 2022 -0700 Correct incorrect inputs provided to the CRC functions. The previous releases of zlib were not sensitive to incorrect CRC inputs with bits set above the low 32. This commit restores that behavior, so that applications with such bugs will continue to operate as before.
Diffstat (limited to 'sys/lib')
-rw-r--r--sys/lib/libz/crc32.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/sys/lib/libz/crc32.c b/sys/lib/libz/crc32.c
index a1129e87521..df94f8e73d2 100644
--- a/sys/lib/libz/crc32.c
+++ b/sys/lib/libz/crc32.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: crc32.c,v 1.14 2022/05/08 14:05:29 tb Exp $ */
+/* $OpenBSD: crc32.c,v 1.15 2022/05/08 14:07:54 tb Exp $ */
/* crc32.c -- compute the CRC-32 of a data stream
* Copyright (C) 1995-2022 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
@@ -629,7 +629,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
#endif /* DYNAMIC_CRC_TABLE */
/* Pre-condition the CRC */
- crc ^= 0xffffffff;
+ crc = (~crc) & 0xffffffff;
/* Compute the CRC up to a word boundary. */
while (len && ((z_size_t)buf & 7) != 0) {
@@ -748,7 +748,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
#endif /* DYNAMIC_CRC_TABLE */
/* Pre-condition the CRC */
- crc ^= 0xffffffff;
+ crc = (~crc) & 0xffffffff;
#ifdef W
@@ -1076,7 +1076,7 @@ uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
#ifdef DYNAMIC_CRC_TABLE
once(&made, make_crc_table);
#endif /* DYNAMIC_CRC_TABLE */
- return multmodp(x2nmodp(len2, 3), crc1) ^ crc2;
+ return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff);
}
/* ========================================================================= */
@@ -1111,5 +1111,5 @@ uLong crc32_combine_op(crc1, crc2, op)
uLong crc2;
uLong op;
{
- return multmodp(op, crc1) ^ crc2;
+ return multmodp(op, crc1) ^ (crc2 & 0xffffffff);
}