From 1b162c9efc7aeee65a41ec8284a6effb1f9d68cd Mon Sep 17 00:00:00 2001 From: Dominik Loidolt <dominik.loidolt@univie.ac.at> Date: Tue, 16 Jan 2024 11:50:30 +0100 Subject: [PATCH] Fixing: applying non-zero offset to null pointer when reading a stream with 0 size --- lib/decompress/read_bitstream.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/decompress/read_bitstream.h b/lib/decompress/read_bitstream.h index 920540e..c65090e 100644 --- a/lib/decompress/read_bitstream.h +++ b/lib/decompress/read_bitstream.h @@ -45,6 +45,7 @@ #include <string.h> #include "../common/byteorder.h" +#include "../common/compiler.h" @@ -123,14 +124,18 @@ static __inline uint64_t bit_read_unaligned_64be(const void *ptr) static __inline size_t bit_init_decoder(struct bit_decoder *dec, const void *buf, size_t buf_size) { + assert(dec != NULL); + assert(buf != NULL); + + dec->cursor = (const uint8_t *)buf; + if (buf_size < 1) { - memset(dec, 0, sizeof(*dec)); dec->bits_consumed = sizeof(dec->bit_container)*8; + dec->bit_container = 0; + dec->limit_ptr = (const uint8_t *)buf; return 0; } - dec->cursor = (const uint8_t *)buf; - if (buf_size >= sizeof(dec->bit_container)) { /* normal case */ dec->bits_consumed = 0; dec->bit_container = bit_read_unaligned_64be(dec->cursor); @@ -320,7 +325,7 @@ static __inline int bit_refill(struct bit_decoder *dec) { unsigned int const bytes_consumed = dec->bits_consumed >> 3; - if (dec->bits_consumed > sizeof(dec->bit_container)*8) + if (unlikely(dec->bits_consumed > sizeof(dec->bit_container)*8)) return BIT_OVERFLOW; if (dec->cursor + bytes_consumed < dec->limit_ptr) { -- GitLab