builtin/repack.c: avoid leaking child arguments

`git repack` invokes a handful of child processes: one to write the actual pack, and optionally ones to repack promisor objects and update the MIDX. Most of these are freed automatically by calling `start_command()` (which invokes it on error) and `finish_command()` which calls it automatically. But repack_promisor_objects() can initialize a child_process, populate its array of arguments, and then return from the function before even calling start_command(). Make sure that the prepared list of arguments is freed by calling child_process_clear() ourselves to avoid leaking memory along this path. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Taylor Blau committed Oct 28, 2021 at 16:25 UTC e6432e0f1f183595b265b76ca765c612e705c65a
1 file changed +3 -1
builtin/repack.c
+3 -1
@@ -258,9 +258,11 @@ static void repack_promisor_objects(const struct pack_objects_args *args,
258 for_each_packed_object(write_oid, &cmd,
259 FOR_EACH_OBJECT_PROMISOR_ONLY);
260
261 - if (cmd.in == -1)
261 + if (cmd.in == -1) {
262 /* No packed objects; cmd was never started */
263 + child_process_clear(&cmd);
264 return;
265 + }
266
267 close(cmd.in);
268