As described in the previous commit, now that we have a functional `bitmap_index_seek()`, rewrite all callers that manually manipulate the `map_pos` variable with calls to `bitmap_index_seek()`. This means that all callers that adjust the value of `map_pos` have those changes automatically bounds- and overflow-checked. Signed-off-by: Taylor Blau <me@xxxxxxxxxxxx> --- pack-bitmap.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/pack-bitmap.c b/pack-bitmap.c index fabcf01c14..38a3c6a3f9 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -174,7 +174,7 @@ static struct ewah_bitmap *read_bitmap_1(struct bitmap_index *index) return NULL; } - index->map_pos += bitmap_size; + bitmap_index_seek(index, bitmap_size, SEEK_CUR); return b; } @@ -230,7 +230,7 @@ static int load_bitmap_header(struct bitmap_index *index) index->entry_count = ntohl(header->entry_count); index->checksum = header->checksum; - index->map_pos += header_size; + bitmap_index_seek(index, header_size, SEEK_CUR); return 0; } @@ -269,13 +269,15 @@ static struct stored_bitmap *store_bitmap(struct bitmap_index *index, static uint32_t read_be32(struct bitmap_index *bitmap_git) { uint32_t result = get_be32(bitmap_git->map + bitmap_git->map_pos); - bitmap_git->map_pos += sizeof(result); + bitmap_index_seek(bitmap_git, sizeof(uint32_t), SEEK_CUR); return result; } static uint8_t read_u8(struct bitmap_index *bitmap_git) { - return bitmap_git->map[bitmap_git->map_pos++]; + uint8_t result = bitmap_git->map[bitmap_git->map_pos]; + bitmap_index_seek(bitmap_git, sizeof(uint8_t), SEEK_CUR); + return result; } #define MAX_XOR_OFFSET 160 @@ -794,14 +796,16 @@ static struct stored_bitmap *lazy_bitmap_for_commit(struct bitmap_index *bitmap_ while (xor_items_nr) { xor_item = &xor_items[xor_items_nr - 1]; - bitmap_git->map_pos = xor_item->offset; + bitmap_index_seek(bitmap_git, xor_item->offset, SEEK_SET); + if (bitmap_git->map_size - bitmap_git->map_pos < bitmap_header_size) { error(_("corrupt ewah bitmap: truncated header for bitmap of commit \"%s\""), oid_to_hex(&xor_item->oid)); goto corrupt; } - bitmap_git->map_pos += sizeof(uint32_t) + sizeof(uint8_t); + bitmap_index_seek(bitmap_git, + sizeof(uint32_t) + sizeof(uint8_t), SEEK_CUR); xor_flags = read_u8(bitmap_git); bitmap = read_bitmap_1(bitmap_git); @@ -812,7 +816,7 @@ static struct stored_bitmap *lazy_bitmap_for_commit(struct bitmap_index *bitmap_ xor_items_nr--; } - bitmap_git->map_pos = offset; + bitmap_index_seek(bitmap_git, offset, SEEK_SET); if (bitmap_git->map_size - bitmap_git->map_pos < bitmap_header_size) { error(_("corrupt ewah bitmap: truncated header for bitmap of commit \"%s\""), oid_to_hex(oid)); @@ -842,7 +846,8 @@ static struct stored_bitmap *lazy_bitmap_for_commit(struct bitmap_index *bitmap_ * Instead, we can skip ahead and immediately read the flags and * ewah bitmap. */ - bitmap_git->map_pos += sizeof(uint32_t) + sizeof(uint8_t); + bitmap_index_seek(bitmap_git, sizeof(uint32_t) + sizeof(uint8_t), + SEEK_CUR); flags = read_u8(bitmap_git); bitmap = read_bitmap_1(bitmap_git); -- 2.40.0.77.gd564125b3f