aboutsummaryrefslogtreecommitdiff
path: root/crc32.c
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2022-03-30 11:14:53 -0700
committerMark Adler <madler@alumni.caltech.edu>2022-03-30 11:14:53 -0700
commitec3df00224d4b396e2ac6586ab5d25f673caa4c2 (patch)
tree920d4f9d58c4ed76475be1044bae19b23e2c1180 /crc32.c
parentce12773790517034317274f5c65ba70cfeea29f7 (diff)
downloadzlib-ec3df00224d4b396e2ac6586ab5d25f673caa4c2.tar.gz
zlib-ec3df00224d4b396e2ac6586ab5d25f673caa4c2.tar.bz2
zlib-ec3df00224d4b396e2ac6586ab5d25f673caa4c2.zip
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 'crc32.c')
-rw-r--r--crc32.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/crc32.c b/crc32.c
index a1bdce5..451887b 100644
--- a/crc32.c
+++ b/crc32.c
@@ -630,7 +630,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
630#endif /* DYNAMIC_CRC_TABLE */ 630#endif /* DYNAMIC_CRC_TABLE */
631 631
632 /* Pre-condition the CRC */ 632 /* Pre-condition the CRC */
633 crc ^= 0xffffffff; 633 crc = (~crc) & 0xffffffff;
634 634
635 /* Compute the CRC up to a word boundary. */ 635 /* Compute the CRC up to a word boundary. */
636 while (len && ((z_size_t)buf & 7) != 0) { 636 while (len && ((z_size_t)buf & 7) != 0) {
@@ -749,7 +749,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
749#endif /* DYNAMIC_CRC_TABLE */ 749#endif /* DYNAMIC_CRC_TABLE */
750 750
751 /* Pre-condition the CRC */ 751 /* Pre-condition the CRC */
752 crc ^= 0xffffffff; 752 crc = (~crc) & 0xffffffff;
753 753
754#ifdef W 754#ifdef W
755 755
@@ -1077,7 +1077,7 @@ uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
1077#ifdef DYNAMIC_CRC_TABLE 1077#ifdef DYNAMIC_CRC_TABLE
1078 once(&made, make_crc_table); 1078 once(&made, make_crc_table);
1079#endif /* DYNAMIC_CRC_TABLE */ 1079#endif /* DYNAMIC_CRC_TABLE */
1080 return multmodp(x2nmodp(len2, 3), crc1) ^ crc2; 1080 return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff);
1081} 1081}
1082 1082
1083/* ========================================================================= */ 1083/* ========================================================================= */
@@ -1112,5 +1112,5 @@ uLong crc32_combine_op(crc1, crc2, op)
1112 uLong crc2; 1112 uLong crc2;
1113 uLong op; 1113 uLong op;
1114{ 1114{
1115 return multmodp(op, crc1) ^ crc2; 1115 return multmodp(op, crc1) ^ (crc2 & 0xffffffff);
1116} 1116}