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: