diff options
author | Mark Adler <madler@alumni.caltech.edu> | 2022-03-30 11:14:53 -0700 |
---|---|---|
committer | Mark Adler <madler@alumni.caltech.edu> | 2022-03-30 11:14:53 -0700 |
commit | ec3df00224d4b396e2ac6586ab5d25f673caa4c2 (patch) | |
tree | 920d4f9d58c4ed76475be1044bae19b23e2c1180 /crc32.c | |
parent | ce12773790517034317274f5c65ba70cfeea29f7 (diff) | |
download | zlib-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.c | 8 |
1 files changed, 4 insertions, 4 deletions
@@ -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 | } |