已关闭
fix: CVE-2026-27171 crc32_combine CPU consumption (backport of zlib 1.3.2 fix) [OpenHarmony-5.1.0-Release] #115
fix: CVE-2026-27171 crc32_combine CPU consumption (backport of zlib 1.3.2 fix) [OpenHarmony-5.1.0-Release] #115
已关闭
wu-jinpeng981212创建于 24 天前关闭于 3 天前
1 个文件变更+10-6
Mcrc32.c+10-6
@@ -173,13 +173,13 @@ local z_crc_t multmodp(z_crc_t a, z_crc_t b)
173 173 
174/*174/*
175 Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been175 Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been
176- initialized.176+ initialized. n must not be negative.
177 */177 */
178-local z_crc_t x2nmodp(z_off64_t n, unsigned k)178+local uLong x2nmodp(z_off64_t n, unsigned k)
179{179{
180- z_crc_t p;180+ uLong p;
181 181 
182- p = (z_crc_t)1 << 31; /* x^0 == 1 */182+ p = (uLong)1 << 31; /* x^0 == 1 */
183 while (n) {183 while (n) {
184 if (n & 1)184 if (n & 1)
185 p = multmodp(x2n_table[k & 31], p);185 p = multmodp(x2n_table[k & 31], p);
@@ -538,7 +538,7 @@ local void braid(z_crc_t ltl[][256], z_word_t big[][256], int n, int w)
538 int k;538 int k;
539 z_crc_t i, p, q;539 z_crc_t i, p, q;
540 for (k = 0; k < w; k++) {540 for (k = 0; k < w; k++) {
541- p = x2nmodp((n * w + 3 - k) << 3, 0);541+ p = (z_crc_t)x2nmodp((n * w + 3 - k) << 3, 0);
542 ltl[k][0] = 0;542 ltl[k][0] = 0;
543 big[w - 1 - k][0] = 0;543 big[w - 1 - k][0] = 0;
544 for (i = 1; i < 256; i++) {544 for (i = 1; i < 256; i++) {
@@ -649,7 +649,7 @@ unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
649 }649 }
650 word += 3 * last;650 word += 3 * last;
651 num -= 3 * last;651 num -= 3 * last;
652- val = x2nmodp(last, 6);652+ val = x2nmodp((int)last, 6);
653 crc = multmodp(val, crc) ^ crc1;653 crc = multmodp(val, crc) ^ crc1;
654 crc = multmodp(val, crc) ^ crc2;654 crc = multmodp(val, crc) ^ crc2;
655 }655 }
@@ -1030,6 +1030,8 @@ unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf,
1030 1030 
1031/* ========================================================================= */1031/* ========================================================================= */
1032uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) {1032uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) {
1033+ if (len2 < 0)
1034+ return 0;
1033#ifdef DYNAMIC_CRC_TABLE1035#ifdef DYNAMIC_CRC_TABLE
1034 once(&made, make_crc_table);1036 once(&made, make_crc_table);
1035#endif /* DYNAMIC_CRC_TABLE */1037#endif /* DYNAMIC_CRC_TABLE */
@@ -1043,6 +1045,8 @@ uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) {
1043 1045 
1044/* ========================================================================= */1046/* ========================================================================= */
1045uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) {1047uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) {
1048+ if (len2 < 0)
1049+ return 0;
1046#ifdef DYNAMIC_CRC_TABLE1050#ifdef DYNAMIC_CRC_TABLE
1047 once(&made, make_crc_table);1051 once(&made, make_crc_table);
1048#endif /* DYNAMIC_CRC_TABLE */1052#endif /* DYNAMIC_CRC_TABLE */