diff --git a/src/bitvec.c b/src/bitvec.c index b411a721d..2303a0df3 100644 --- a/src/bitvec.c +++ b/src/bitvec.c @@ -480,15 +480,18 @@ uint64_t bitvec_read_field(struct bitvec *bv, unsigned int *read_index, unsigned { unsigned int i; uint64_t ui = 0; + + /* Prevent bitvec overrun due to incorrect index and/or length */ + if (len && bytenum_from_bitnum(*read_index + len - 1) >= bv->data_len) { + errno = EOVERFLOW; + return 0; + } + bv->cur_bit = *read_index; errno = 0; for (i = 0; i < len; i++) { int bit = bitvec_get_bit_pos((const struct bitvec *)bv, bv->cur_bit); - if (bit < 0) { - errno = -bit; - break; - } if (bit) ui |= ((uint64_t)1 << (len - i - 1)); bv->cur_bit++; diff --git a/tests/bitvec/bitvec_test.ok b/tests/bitvec/bitvec_test.ok index a0e31d3f1..d87ac7e04 100644 --- a/tests/bitvec/bitvec_test.ok +++ b/tests/bitvec/bitvec_test.ok @@ -185,7 +185,7 @@ bitvec_read_field(idx=10, len=5) => 16 (success) bitvec_read_field(idx=10, len=3) => 5 (success) bitvec_read_field(idx=10, len=1) => 1 (success) bitvec_read_field(idx=512, len=16) => 0 (error) -bitvec_read_field(idx=0, len=65) => bd5b7ddffdd7b5db (error) +bitvec_read_field(idx=0, len=65) => 0 (error) bitvec_read_field(idx=64, len=16) => 0 (error) bitvec ok.