]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Fix invalid assert in 32-bit decoding
authorNick Terrell <terrelln@fb.com>
Fri, 27 Jan 2023 19:14:56 +0000 (11:14 -0800)
committerNick Terrell <nickrterrell@gmail.com>
Fri, 27 Jan 2023 22:40:38 +0000 (14:40 -0800)
The assert is only correct for valid sequences, so disable it for
everything execpt round trip fuzzers.

lib/decompress/zstd_decompress_block.c

index 95a5e109b23a54da6f0a2699a8cfb9350e9b6943..0d934043be64d503558a4ae41c677c67162b3095 100644 (file)
@@ -1241,7 +1241,13 @@ ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets)
                     offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
                     BIT_reloadDStream(&seqState->DStream);
                     if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
+#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE)
+                    /* This assert is only valid when decoding valid sequences.
+                     * It cal fail when we consume more bits than are in the bitstream,
+                     * which can happen on corruption.
+                     */
                     assert(extraBits <= LONG_OFFSETS_MAX_EXTRA_BITS_32);   /* to avoid another reload */
+#endif
                 } else {
                     offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/);   /* <=  (ZSTD_WINDOWLOG_MAX-1) bits */
                     if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);