repack: fix leaks on error with "goto cleanup"

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>

Ævar Arnfjörð Bjarmason committed Feb 7, 2023 at 00:07 UTC 90428ddccf7bc0c0c192fc973b2d1a7a47605e10
3 files changed +9 -6
builtin/repack.c
+7 -6
@@ -948,7 +948,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
948
949 ret = start_command(&cmd);
950 if (ret)
951 - return ret;
951 + goto cleanup;
952
953 if (geometry) {
954 FILE *in = xfdopen(cmd.in, "w");
@@ -977,7 +977,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
977 fclose(out);
978 ret = finish_command(&cmd);
979 if (ret)
980 - return ret;
980 + goto cleanup;
981
982 if (!names.nr && !po_args.quiet)
983 printf_ln(_("Nothing new to pack."));
@@ -1007,7 +1007,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
1007 &existing_nonkept_packs,
1008 &existing_kept_packs);
1009 if (ret)
1010 - return ret;
1010 + goto cleanup;
1011
1012 if (delete_redundant && expire_to) {
1013 /*
@@ -1039,7 +1039,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
1039 &existing_nonkept_packs,
1040 &existing_kept_packs);
1041 if (ret)
1042 - return ret;
1042 + goto cleanup;
1043 }
1044 }
1045
@@ -1115,7 +1115,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
1115 string_list_clear(&include, 0);
1116
1117 if (ret)
1118 - return ret;
1118 + goto cleanup;
1119 }
1120
1121 reprepare_packed_git(the_repository);
@@ -1172,10 +1172,11 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
1172 write_midx_file(get_object_directory(), NULL, NULL, flags);
1173 }
1174
1175 +cleanup:
1176 string_list_clear(&names, 1);
1177 string_list_clear(&existing_nonkept_packs, 0);
1178 string_list_clear(&existing_kept_packs, 0);
1179 clear_pack_geometry(geometry);
1180
1180 - return 0;
1181 + return ret;
1182 }
t/t5312-prune-corruption.sh
+1
@@ -14,6 +14,7 @@ what currently happens. If that changes, these tests should be revisited.
14 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
15 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
16
17 +TEST_PASSES_SANITIZE_LEAK=true
18 . ./test-lib.sh
19
20 test_expect_success 'disable reflogs' '
t/t6011-rev-list-with-bad-commit.sh
+1
@@ -2,6 +2,7 @@
2
3 test_description='git rev-list should notice bad commits'
4
5 +TEST_PASSES_SANITIZE_LEAK=true
6 . ./test-lib.sh
7
8 # Note: