Skip to content

Commit bda97cb

Browse files
pks-tgitster
authored andcommitted
builtin/repack: fix leaks when computing packs to repack
When writing an MIDX in git-repack(1) we first collect all the pack names that we want to add to it in a string list. This list is marked as `NODUP`, which indicates that it will neither duplicate nor own strings added to it. In `write_midx_included_packs()` we then `insert()` strings via `xstrdup()` or `strbuf_detach()`, but the resulting strings will not be owned by anything and thus leak. Fix this issue by marking the list as `DUP` and using a local buffer to compute the pack names. This leak is hit in t5319, but plugging it is not sufficient to make the whole test suite pass. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 8a78463 commit bda97cb

File tree

1 file changed

+27
-9
lines changed

1 file changed

+27
-9
lines changed

builtin/repack.c

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -732,14 +732,23 @@ static void midx_included_packs(struct string_list *include,
732732
struct pack_geometry *geometry)
733733
{
734734
struct string_list_item *item;
735+
struct strbuf buf = STRBUF_INIT;
736+
737+
for_each_string_list_item(item, &existing->kept_packs) {
738+
strbuf_reset(&buf);
739+
strbuf_addf(&buf, "%s.idx", item->string);
740+
string_list_insert(include, buf.buf);
741+
}
742+
743+
for_each_string_list_item(item, names) {
744+
strbuf_reset(&buf);
745+
strbuf_addf(&buf, "pack-%s.idx", item->string);
746+
string_list_insert(include, buf.buf);
747+
}
735748

736-
for_each_string_list_item(item, &existing->kept_packs)
737-
string_list_insert(include, xstrfmt("%s.idx", item->string));
738-
for_each_string_list_item(item, names)
739-
string_list_insert(include, xstrfmt("pack-%s.idx", item->string));
740749
if (geometry->split_factor) {
741-
struct strbuf buf = STRBUF_INIT;
742750
uint32_t i;
751+
743752
for (i = geometry->split; i < geometry->pack_nr; i++) {
744753
struct packed_git *p = geometry->pack[i];
745754

@@ -754,17 +763,21 @@ static void midx_included_packs(struct string_list *include,
754763
if (!p->pack_local)
755764
continue;
756765

766+
strbuf_reset(&buf);
757767
strbuf_addstr(&buf, pack_basename(p));
758768
strbuf_strip_suffix(&buf, ".pack");
759769
strbuf_addstr(&buf, ".idx");
760770

761-
string_list_insert(include, strbuf_detach(&buf, NULL));
771+
string_list_insert(include, buf.buf);
762772
}
763773
} else {
764774
for_each_string_list_item(item, &existing->non_kept_packs) {
765775
if (pack_is_marked_for_deletion(item))
766776
continue;
767-
string_list_insert(include, xstrfmt("%s.idx", item->string));
777+
778+
strbuf_reset(&buf);
779+
strbuf_addf(&buf, "%s.idx", item->string);
780+
string_list_insert(include, buf.buf);
768781
}
769782
}
770783

@@ -784,8 +797,13 @@ static void midx_included_packs(struct string_list *include,
784797
*/
785798
if (pack_is_marked_for_deletion(item))
786799
continue;
787-
string_list_insert(include, xstrfmt("%s.idx", item->string));
800+
801+
strbuf_reset(&buf);
802+
strbuf_addf(&buf, "%s.idx", item->string);
803+
string_list_insert(include, buf.buf);
788804
}
805+
806+
strbuf_release(&buf);
789807
}
790808

791809
static int write_midx_included_packs(struct string_list *include,
@@ -1476,7 +1494,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
14761494
mark_packs_for_deletion(&existing, &names);
14771495

14781496
if (write_midx) {
1479-
struct string_list include = STRING_LIST_INIT_NODUP;
1497+
struct string_list include = STRING_LIST_INIT_DUP;
14801498
midx_included_packs(&include, &existing, &names, &geometry);
14811499

14821500
ret = write_midx_included_packs(&include, &geometry, &names,

0 commit comments

Comments
 (0)