]> git.ipfire.org Git - thirdparty/git.git/commitdiff
repack: fix leaks on error with "goto cleanup"
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Mon, 6 Feb 2023 23:07:42 +0000 (00:07 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 6 Feb 2023 23:34:37 +0000 (15:34 -0800)
In cmd_repack() when we hit an error, replace "return ret" with "goto
cleanup" to ensure we free the necessary data structures.

Helped-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/repack.c
t/t5312-prune-corruption.sh
t/t6011-rev-list-with-bad-commit.sh

index c1402ad038f2d4e2a60441db11fb1209e7d63c62..f64937953184fd346923bafed6f7868bd99cded5 100644 (file)
@@ -948,7 +948,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 
        ret = start_command(&cmd);
        if (ret)
-               return ret;
+               goto cleanup;
 
        if (geometry) {
                FILE *in = xfdopen(cmd.in, "w");
@@ -977,7 +977,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
        fclose(out);
        ret = finish_command(&cmd);
        if (ret)
-               return ret;
+               goto cleanup;
 
        if (!names.nr && !po_args.quiet)
                printf_ln(_("Nothing new to pack."));
@@ -1007,7 +1007,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
                                       &existing_nonkept_packs,
                                       &existing_kept_packs);
                if (ret)
-                       return ret;
+                       goto cleanup;
 
                if (delete_redundant && expire_to) {
                        /*
@@ -1039,7 +1039,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
                                               &existing_nonkept_packs,
                                               &existing_kept_packs);
                        if (ret)
-                               return ret;
+                               goto cleanup;
                }
        }
 
@@ -1115,7 +1115,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
                string_list_clear(&include, 0);
 
                if (ret)
-                       return ret;
+                       goto cleanup;
        }
 
        reprepare_packed_git(the_repository);
@@ -1172,10 +1172,11 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
                write_midx_file(get_object_directory(), NULL, NULL, flags);
        }
 
+cleanup:
        string_list_clear(&names, 1);
        string_list_clear(&existing_nonkept_packs, 0);
        string_list_clear(&existing_kept_packs, 0);
        clear_pack_geometry(geometry);
 
-       return 0;
+       return ret;
 }
index 9d8e249ae8b7f38c4c941bd76ef904cdfe1b3d27..230cb3871223e1f28482c841093cb7a0e6873754 100755 (executable)
@@ -14,6 +14,7 @@ what currently happens. If that changes, these tests should be revisited.
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'disable reflogs' '
index bad02cf5b83dbc014c23cc8ac66135e0cf095138..b2e422cf0f7eaa43411fdb6f2bb769ee7294a322 100755 (executable)
@@ -2,6 +2,7 @@
 
 test_description='git rev-list should notice bad commits'
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Note: