decompress_crbb: add length argument for search_runlen

search_runlen() must know the exact size in bits when parsing
the bits otherwise it read over the buffer.
Fixes testcase #7 which was wrongly decoded.

Change-Id: Ie34a0651e7e7efea4e9ecff1e3a467588113cf47
This commit is contained in:
Alexander Couzens 2019-06-17 01:41:29 +02:00 committed by laforge
parent 3a499f3cb2
commit 2d24eba903
3 changed files with 14 additions and 14 deletions

View File

@ -449,6 +449,7 @@ const char *zero_run_len_code_list[EGPRS_CODEWORDS] = {
/* Calculate runlength of a codeword /* Calculate runlength of a codeword
* \param root[in] Root of Ones or Zeros tree * \param root[in] Root of Ones or Zeros tree
* \param bmbuf[in] Received compressed bitmap buf * \param bmbuf[in] Received compressed bitmap buf
* \param length[in] Length of bitmap buf in bits
* \param bit_pos[in] The start bit pos to read codeword * \param bit_pos[in] The start bit pos to read codeword
* \param len_codewd[in] Length of code word * \param len_codewd[in] Length of code word
* \param rlen[out] Calculated run length * \param rlen[out] Calculated run length
@ -456,6 +457,7 @@ const char *zero_run_len_code_list[EGPRS_CODEWORDS] = {
static int search_runlen( static int search_runlen(
egprs_compress_node *root, egprs_compress_node *root,
const uint8_t *bmbuf, const uint8_t *bmbuf,
uint8_t length,
uint8_t bit_pos, uint8_t bit_pos,
uint8_t *len_codewd, uint8_t *len_codewd,
uint16_t *rlen) uint16_t *rlen)
@ -469,6 +471,9 @@ static int search_runlen(
while (iter->run_length == -1) { while (iter->run_length == -1) {
if ((!iter->left) && (!iter->right)) if ((!iter->left) && (!iter->right))
return -1; return -1;
if (bit_pos >= length)
return -1;
/* get the bit value at the bitpos and put it in right most of dir */ /* get the bit value at the bitpos and put it in right most of dir */
dir = (bmbuf[bit_pos/8] >> (7 - (bit_pos & 0x07))) & 0x01; dir = (bmbuf[bit_pos/8] >> (7 - (bit_pos & 0x07))) & 0x01;
bit_pos++; bit_pos++;
@ -498,7 +503,7 @@ int egprs_compress::decompress_crbb(
const uint8_t *orig_crbb_buf, const uint8_t *orig_crbb_buf,
bitvec *dest) bitvec *dest)
{ {
int8_t remaining_bmap_len = compress_bmap_len;
uint8_t bit_pos = 0; uint8_t bit_pos = 0;
uint8_t data; uint8_t data;
egprs_compress_node *list = NULL; egprs_compress_node *list = NULL;
@ -509,7 +514,7 @@ int egprs_compress::decompress_crbb(
int rc = 0; int rc = 0;
egprs_compress *compress = instance(); egprs_compress *compress = instance();
while (compress_bmap_len > 0) { while (remaining_bmap_len > 0) {
if (start) { if (start) {
data = 0xff; data = 0xff;
list = compress->ones_list; list = compress->ones_list;
@ -517,7 +522,7 @@ int egprs_compress::decompress_crbb(
data = 0x00; data = 0x00;
list = compress->zeros_list; list = compress->zeros_list;
} }
rc = search_runlen(list, orig_crbb_buf, rc = search_runlen(list, orig_crbb_buf, compress_bmap_len,
bit_pos, &nbits, &run_length); bit_pos, &nbits, &run_length);
if (rc == -1) if (rc == -1)
return -1; return -1;
@ -525,6 +530,7 @@ int egprs_compress::decompress_crbb(
if (run_length < 64) if (run_length < 64)
start = !start; start = !start;
cbmaplen = cbmaplen + run_length; cbmaplen = cbmaplen + run_length;
/* put run length of Ones in uncompressed bitmap */ /* put run length of Ones in uncompressed bitmap */
while (run_length != 0) { while (run_length != 0) {
if (run_length > 8) { if (run_length > 8) {
@ -536,7 +542,7 @@ int egprs_compress::decompress_crbb(
} }
} }
bit_pos = bit_pos + nbits; bit_pos = bit_pos + nbits;
compress_bmap_len = compress_bmap_len - nbits; remaining_bmap_len = remaining_bmap_len - nbits;
} }
return 0; return 0;
} }

View File

@ -91,14 +91,13 @@ struct test_data {
.ucmp_len = 90, .ucmp_len = 90,
.expect_rc = 0, .expect_rc = 0,
}, },
/* TODO: previously marked as "Invalid inputs" but succeeds */ /* Invalid inputs */
{ .crbb_len = 18, .cc = 1, { .crbb_len = 18, .cc = 1,
.crbb_data = {0x1E, 0x70, 0xc0}, .crbb_data = {0x1E, 0x70, 0xc0},
.ucmp_data = {0xb0, 0x00, 0x00}, .ucmp_data = {0xb0, 0x00, 0x00},
.ucmp_len = 19, .ucmp_len = 19,
.expect_rc = 0, .expect_rc = -1,
}, },
/* Invalid inputs */
{ .crbb_len = 14, .cc = 1, { .crbb_len = 14, .cc = 1,
.crbb_data = {0x00, 0x1E, 0x7c}, .crbb_data = {0x00, 0x1E, 0x7c},
.ucmp_data = {0x0}, .ucmp_data = {0x0},

View File

@ -108,13 +108,8 @@ len = 18
Run_length = 1 Run_length = 1
Run_length = 1 Run_length = 1
Run_length = 2 Run_length = 2
Run_length = 15 rc = -1
rc = 0 Failed to decode CRBB: length 18, data 1e 70 c0
expected data = b0 00 00
expected len = 19
decoded data = b0 00 00
decoded len = 19
Test:8 Test:8
Tree based decoding: Tree based decoding: