midx.c: write MIDX filenames to strbuf
To ask for the name of a MIDX and its corresponding .rev file, callers invoke get_midx_filename() and get_midx_rev_filename(), respectively. These both invoke xstrfmt(), allocating a chunk of memory which must be freed later on. This makes callers in pack-bitmap.c somewhat awkward. Specifically, midx_bitmap_filename(), which is implemented like: return xstrfmt("%s-%s.bitmap", get_midx_filename(midx->object_dir), hash_to_hex(get_midx_checksum(midx))); this leaks the second argument to xstrfmt(), which itself was allocated with xstrfmt(). This caller could assign both the result of get_midx_filename() and the outer xstrfmt() to a temporary variable, remembering to free() the former before returning. But that involves a wasteful copy. Instead, get_midx_filename() and get_midx_rev_filename() take a strbuf as an output parameter. This way midx_bitmap_filename() can manipulate and pass around a temporary buffer which it detaches back to its caller. That allows us to implement the function without copying or open-coding get_midx_filename() in a way that doesn't leak. Update the other callers of get_midx_filename() and get_midx_rev_filename() accordingly. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
ee4a1d63d7
commit
60980aed78
@ -292,9 +292,12 @@ static int load_bitmap_entries_v1(struct bitmap_index *index)
|
||||
|
||||
char *midx_bitmap_filename(struct multi_pack_index *midx)
|
||||
{
|
||||
return xstrfmt("%s-%s.bitmap",
|
||||
get_midx_filename(midx->object_dir),
|
||||
hash_to_hex(get_midx_checksum(midx)));
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
|
||||
get_midx_filename(&buf, midx->object_dir);
|
||||
strbuf_addf(&buf, "-%s.bitmap", hash_to_hex(get_midx_checksum(midx)));
|
||||
|
||||
return strbuf_detach(&buf, NULL);
|
||||
}
|
||||
|
||||
char *pack_bitmap_filename(struct packed_git *p)
|
||||
@ -324,10 +327,12 @@ static int open_midx_bitmap_1(struct bitmap_index *bitmap_git,
|
||||
}
|
||||
|
||||
if (bitmap_git->pack || bitmap_git->midx) {
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
get_midx_filename(&buf, midx->object_dir);
|
||||
/* ignore extra bitmap file; we can only handle one */
|
||||
warning("ignoring extra bitmap file: %s",
|
||||
get_midx_filename(midx->object_dir));
|
||||
warning("ignoring extra bitmap file: %s", buf.buf);
|
||||
close(fd);
|
||||
strbuf_release(&buf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user