Skip to content

Commit

Permalink
pack-bitmap.c: use bitmap_index_seek() where possible
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
ttaylorr committed Mar 24, 2023
1 parent 07a87f3 commit ba598cc
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions pack-bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,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;
}

Expand Down Expand Up @@ -232,7 +232,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;
}

Expand Down Expand Up @@ -271,13 +271,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
Expand Down Expand Up @@ -796,14 +798,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);

Expand All @@ -814,7 +818,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));
Expand Down Expand Up @@ -844,7 +848,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);

Expand Down

0 comments on commit ba598cc

Please sign in to comment.