summaryrefslogtreecommitdiffstats
path: root/midx-write.c
diff options
context:
space:
mode:
authorDerrick Stolee <stolee@gmail.com>2025-09-05 19:26:15 +0000
committerJunio C Hamano <gitster@pobox.com>2025-09-05 12:32:00 -0700
commit9c2262d65dee8c1e3656b01f7db0660181902d2a (patch)
tree6b80b7bfc8948dbd6f0489efe3457b7700dcd207 /midx-write.c
parentmidx-write: put failing response value back (diff)
downloadgit-9c2262d65dee8c1e3656b01f7db0660181902d2a.tar.gz
git-9c2262d65dee8c1e3656b01f7db0660181902d2a.zip
midx-write: use cleanup when incremental midx fails
The incremental mode of writing a multi-pack-index has a few extra conditions that could lead to failure, but these are currently short-ciruiting with 'return -1' instead of setting the method's 'result' variable and going to the cleanup tag. Replace these returns with gotos to avoid memory issues when exiting early due to error conditions. Unfortunately, these error conditions are difficult to reproduce with test cases, which is perhaps one reason why the memory loss was not caught by existing test cases in memory tracking modes. Signed-off-by: Derrick Stolee <stolee@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to '')
-rw-r--r--midx-write.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/midx-write.c b/midx-write.c
index 4c8af23861..e8864386d8 100644
--- a/midx-write.c
+++ b/midx-write.c
@@ -1345,13 +1345,15 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
incr = mks_tempfile_m(midx_name.buf, 0444);
if (!incr) {
error(_("unable to create temporary MIDX layer"));
- return -1;
+ result = -1;
+ goto cleanup;
}
if (adjust_shared_perm(r, get_tempfile_path(incr))) {
error(_("unable to adjust shared permissions for '%s'"),
get_tempfile_path(incr));
- return -1;
+ result = -1;
+ goto cleanup;
}
f = hashfd(r->hash_algo, get_tempfile_fd(incr),
@@ -1451,18 +1453,22 @@ static int write_midx_internal(struct repository *r, const char *object_dir,
if (!chainf) {
error_errno(_("unable to open multi-pack-index chain file"));
- return -1;
+ result = -1;
+ goto cleanup;
}
- if (link_midx_to_chain(ctx.base_midx) < 0)
- return -1;
+ if (link_midx_to_chain(ctx.base_midx) < 0) {
+ result = -1;
+ goto cleanup;
+ }
get_split_midx_filename_ext(r->hash_algo, &final_midx_name,
object_dir, midx_hash, MIDX_EXT_MIDX);
if (rename_tempfile(&incr, final_midx_name.buf) < 0) {
error_errno(_("unable to rename new multi-pack-index layer"));
- return -1;
+ result = -1;
+ goto cleanup;
}
strbuf_release(&final_midx_name);