]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Fixed ubsan error in deflatePrime when bits is 32.
authorNathan Moinvaziri <nathan@nathanm.com>
Sat, 4 Jul 2020 03:05:53 +0000 (20:05 -0700)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Fri, 10 Jul 2020 13:41:41 +0000 (15:41 +0200)
    deflate.c:602:15: runtime error: shift exponent 32 is too large for 32-bit type 'int32_t' (aka 'int')
    SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /src/zlib-ng/deflate.c:602:15

deflate.c

index 2a77a9f751c2b4968a6776a9f56b97a4ac04edb6..8af1af32a18f815af89036bf15f9706f59b7e5f6 100644 (file)
--- a/deflate.c
+++ b/deflate.c
@@ -581,6 +581,7 @@ int32_t ZEXPORT PREFIX(deflatePending)(PREFIX3(stream) *strm, uint32_t *pending,
 /* ========================================================================= */
 int32_t ZEXPORT PREFIX(deflatePrime)(PREFIX3(stream) *strm, int32_t bits, int32_t value) {
     deflate_state *s;
+    uint64_t value64 = (uint64_t)value;
     int32_t put;
 
     if (deflateStateCheck(strm))
@@ -594,12 +595,12 @@ int32_t ZEXPORT PREFIX(deflatePrime)(PREFIX3(stream) *strm, int32_t bits, int32_
         if (put > bits)
             put = bits;
         if (s->bi_valid == 0)
-            s->bi_buf = (uint64_t)value;
+            s->bi_buf = value64;
         else
-            s->bi_buf |= (((uint64_t)value & ((UINT64_C(1) << put) - 1)) << s->bi_valid);
+            s->bi_buf |= (value64 & ((UINT64_C(1) << put) - 1)) << s->bi_valid;
         s->bi_valid += put;
         zng_tr_flush_bits(s);
-        value >>= put;
+        value64 >>= put;
         bits -= put;
     } while (bits);
     return Z_OK;