]> git.ipfire.org Git - thirdparty/git.git/commitdiff
upload-pack: fix leaking child process data on reachability checks
authorPatrick Steinhardt <ps@pks.im>
Thu, 5 Sep 2024 10:08:48 +0000 (12:08 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Sep 2024 15:49:11 +0000 (08:49 -0700)
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>
t/t5516-fetch-push.sh
upload-pack.c

index 9d693eb57f7790ddb81cee0b905a101719069562..331778bd42cac3fbe94fdc62614e30ac2e623045 100755 (executable)
@@ -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)
index f03ba3e98be736ca1b97ab0854ac45c915be683f..c84c3c3b1f514e0cd1e20b6869e679d34b18c47a 100644 (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;
 }