diff --git a/src/fstapi.c b/src/fstapi.c index 422c6ef..6251ff1 100644 --- a/src/fstapi.c +++ b/src/fstapi.c @@ -5086,10 +5086,11 @@ static int fstReaderParseChainTable(unsigned char *chain_cmem, if (shval > 0) { pval = chain_table[idx] = pval + shval; - if (idx) { + if (have_physical_chain) { chain_table_lengths[pidx] = pval - chain_table[pidx]; } pidx = idx++; + have_physical_chain = 1; } else if (shval < 0) { chain_table[idx] = 0; /* need to explicitly zero as calloc above might not run */ @@ -5112,7 +5113,9 @@ static int fstReaderParseChainTable(unsigned char *chain_cmem, } for (i = 0; i < loopcnt; i++) { - chain_table[idx++] = 0; + chain_table[idx] = 0; + chain_table_lengths[idx] = 0; + idx++; } } @@ -5145,10 +5148,11 @@ static int fstReaderParseChainTable(unsigned char *chain_cmem, } pval = chain_table[idx] = pval + (val >> 1); - if (idx) { + if (have_physical_chain) { chain_table_lengths[pidx] = pval - chain_table[pidx]; } pidx = idx++; + have_physical_chain = 1; } else { fstHandle loopcnt = val >> 1; @@ -5157,7 +5161,9 @@ static int fstReaderParseChainTable(unsigned char *chain_cmem, } for (i = 0; i < loopcnt; i++) { - chain_table[idx++] = 0; + chain_table[idx] = 0; + chain_table_lengths[idx] = 0; + idx++; } } @@ -5170,7 +5176,8 @@ static int fstReaderParseChainTable(unsigned char *chain_cmem, /* the entry the room check kept back, so that the last chain a length was written to is as long as the distance from it to the end of the data */ chain_table[idx] = vc_len; - chain_table_lengths[pidx] = chain_table[idx] - chain_table[pidx]; + if (have_physical_chain) + chain_table_lengths[pidx] = chain_table[idx] - chain_table[pidx]; for (i = 0; i < idx; i++) { int32_t v32 = chain_table_lengths[i]; @@ -5272,6 +5279,8 @@ int fstReaderIterBlocks2(fstReaderContext *ctx, uint32_t *tc_head = NULL; uint32_t tc_head_items = 0; traversal_mem_offs = 0; + int have_physical_chain = 0; + pidx = 0; /* current section only */ fstReaderFseeko(xc, xc->f, blkpos, SEEK_SET);