librz/util: fix fill_bit in rz_bv_cast_inplace for small vectors (#6163)
Resulting bitvector contents for fill_bit = true were incorrect. In particular, when extending, the new bits were not set and when shrinking, the cut off bits were set to the fill_bit, even though they would be out of range.
This commit is contained in:
parent
e184f35992
commit
babba5f428
2 changed files with 26 additions and 1 deletions
|
|
@ -2258,8 +2258,13 @@ RZ_API bool rz_bv_cast_inplace(RZ_INOUT RZ_NONNULL RzBitVector *bv, ut32 to_size
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (bv->len <= 64 && to_size <= 64) {
|
if (bv->len <= 64 && to_size <= 64) {
|
||||||
rz_bv_set_range(bv, to_size, bv->len - 1, fill_bit);
|
ut32 old_size = bv->len;
|
||||||
bv->len = to_size;
|
bv->len = to_size;
|
||||||
|
if (to_size > old_size) {
|
||||||
|
rz_bv_set_range(bv, old_size, to_size - 1, fill_bit);
|
||||||
|
} else {
|
||||||
|
bv->bits.small_u &= (1ULL << to_size) - 1;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (NELEM(to_size, BV_ELEM_SIZE) > bv->_elem_len) {
|
if (NELEM(to_size, BV_ELEM_SIZE) > bv->_elem_len) {
|
||||||
|
|
|
||||||
|
|
@ -1526,6 +1526,26 @@ bool test_rz_bv_cast_inplace(void) {
|
||||||
RzBitVector *small = rz_bv_new_from_ut64(20, 0x01234);
|
RzBitVector *small = rz_bv_new_from_ut64(20, 0x01234);
|
||||||
RzBitVector *large = rz_bv_new_from_bytes_be(array_128, 0, 128);
|
RzBitVector *large = rz_bv_new_from_bytes_be(array_128, 0, 128);
|
||||||
|
|
||||||
|
mu_assert_true(rz_bv_cast_inplace(small, 5, true), "Cast failed");
|
||||||
|
mu_assert_eq(rz_bv_to_ut64(small), 0x14, "Mismatch after cast");
|
||||||
|
mu_assert_eq(small->len, 5, "New size is off");
|
||||||
|
mu_assert_null(small->bits.large_a, "Should have been NULL");
|
||||||
|
mu_assert_eq(small->_elem_len, 0, "Should be 0");
|
||||||
|
|
||||||
|
mu_assert_true(rz_bv_cast_inplace(small, 64, true), "Cast failed");
|
||||||
|
mu_assert_eq(rz_bv_to_ut64(small), 0xfffffffffffffff4ULL, "Mismatch after cast");
|
||||||
|
mu_assert_eq(small->len, 64, "New size is off");
|
||||||
|
mu_assert_null(small->bits.large_a, "Should have been NULL");
|
||||||
|
mu_assert_eq(small->_elem_len, 0, "Should be 0");
|
||||||
|
|
||||||
|
mu_assert_true(rz_bv_cast_inplace(small, 65, true), "Cast failed");
|
||||||
|
mu_assert_streq_free(rz_bv_as_hex_string(small, false), "0x1fffffffffffffff4", "small to large cast failed");
|
||||||
|
mu_assert_eq(small->len, 65, "New size is off");
|
||||||
|
mu_assert_notnull(small->bits.large_a, "Buffer not set");
|
||||||
|
mu_assert_eq(small->_elem_len, 9, "Buffer length wrong");
|
||||||
|
|
||||||
|
rz_bv_free(small);
|
||||||
|
small = rz_bv_new_from_ut64(20, 0x01234);
|
||||||
mu_assert_true(rz_bv_cast_inplace(small, 5, false), "Cast failed");
|
mu_assert_true(rz_bv_cast_inplace(small, 5, false), "Cast failed");
|
||||||
mu_assert_eq(rz_bv_to_ut64(small), 0x14, "Mismatch after cast");
|
mu_assert_eq(rz_bv_to_ut64(small), 0x14, "Mismatch after cast");
|
||||||
mu_assert_eq(small->len, 5, "New size is off");
|
mu_assert_eq(small->len, 5, "New size is off");
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue