1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-10-28 04:49:43 +01:00

upload-pack: fix leaking child process data on reachability checks

We spawn a git-rev-list(1) command to perform reachability checks in
"upload-pack.c". We do not release memory associated with the process
in error cases though, thus leaking memory.

Fix these by calling `child_process_clear()`.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt 2024-09-05 12:08:48 +02:00 committed by Junio C Hamano
parent 7eb6f02c55
commit ac2e7d545e
2 changed files with 17 additions and 6 deletions

View file

@ -19,6 +19,7 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_CREATE_REPO_NO_TEMPLATE=1
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh
D=$(pwd)

View file

@ -709,10 +709,13 @@ static int get_reachable_list(struct upload_pack_data *data,
struct object *o;
char namebuf[GIT_MAX_HEXSZ + 2]; /* ^ + hash + LF */
const unsigned hexsz = the_hash_algo->hexsz;
int ret;
if (do_reachable_revlist(&cmd, &data->shallows, reachable,
data->allow_uor) < 0)
return -1;
data->allow_uor) < 0) {
ret = -1;
goto out;
}
while ((i = read_in_full(cmd.out, namebuf, hexsz + 1)) == hexsz + 1) {
struct object_id oid;
@ -736,10 +739,16 @@ static int get_reachable_list(struct upload_pack_data *data,
}
close(cmd.out);
if (finish_command(&cmd))
return -1;
if (finish_command(&cmd)) {
ret = -1;
goto out;
}
return 0;
ret = 0;
out:
child_process_clear(&cmd);
return ret;
}
static int has_unreachable(struct object_array *src, enum allow_uor allow_uor)
@ -749,7 +758,7 @@ static int has_unreachable(struct object_array *src, enum allow_uor allow_uor)
int i;
if (do_reachable_revlist(&cmd, src, NULL, allow_uor) < 0)
return 1;
goto error;
/*
* The commits out of the rev-list are not ancestors of
@ -775,6 +784,7 @@ static int has_unreachable(struct object_array *src, enum allow_uor allow_uor)
error:
if (cmd.out >= 0)
close(cmd.out);
child_process_clear(&cmd);
return 1;
}