From: "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Elijah Newren <newren@gmail.com>, Elijah Newren <newren@gmail.com>
Subject: [PATCH 1/2] replay: fail gracefully when a merge input is unreadable
Date: Tue, 18 Aug 2026 22:34:05 +0000 [thread overview]
Message-ID: <321af575e0a9e0c22c70c1809f6fbf0265b05d4c.1787092446.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2207.git.1787092446.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>
When objects involved in the merge cannot be read, the merge machinery
will return early with result.clean = -1, and result.tree left as NULL.
pick_regular_commit() tested only "if (!result->clean)", ignoring the
case where "clean < 0". That causes the code to try to use
result->tree, resulting in a SIGSEGV.
Handle clean < 0 explicitly; the merge machinery will already have printed
messages such as "Could not read <object>" and "collecting merge info
failed for trees...", so we don't need to add much detail beyond the
fact that the merge failed.
Signed-off-by: Elijah Newren <newren@gmail.com>
---
replay.c | 7 +++++++
t/t3650-replay-basics.sh | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+)
diff --git a/replay.c b/replay.c
index 463c900d6c..33e21b2032 100644
--- a/replay.c
+++ b/replay.c
@@ -327,6 +327,13 @@ static struct commit *pick_regular_commit(struct repository *repo,
merge_opt->ancestor = NULL;
merge_opt->branch2 = NULL;
+ if (result->clean < 0) {
+ error(_("merge of %s onto %s failed"),
+ oid_to_hex(&pickme->object.oid),
+ oid_to_hex(&replayed_base->object.oid));
+ return NULL;
+ }
+
if (!result->clean)
return NULL;
diff --git a/t/t3650-replay-basics.sh b/t/t3650-replay-basics.sh
index 3353bc4a4d..d66b8edb95 100755
--- a/t/t3650-replay-basics.sh
+++ b/t/t3650-replay-basics.sh
@@ -565,4 +565,39 @@ test_expect_success '--onto with --ref rejects multiple revision ranges' '
test_grep "cannot be used with multiple revision ranges" err
'
+test_expect_success 'replay fails without segfault when objects are missing' '
+ test_when_finished "rm -fr unreadable" &&
+ git init unreadable &&
+ (
+ cd unreadable &&
+
+ test_write_lines l1 l2 l3 l4 l5 l6 l7 l8 >f &&
+ git add f &&
+ git commit -m base &&
+ git branch base &&
+
+ test_write_lines l1 l2 l3 l4 l5 l6 l7 CHANGED >f &&
+ git commit -am side &&
+ git branch side &&
+
+ git switch -c onto base &&
+ test_write_lines CHANGED l2 l3 l4 l5 l6 l7 l8 >f &&
+ git commit -am onto &&
+
+ # The replay works while every object is readable.
+ git replay --onto onto base..side &&
+
+ # Removing the onto tree makes parse_tree() fail during the
+ # incore merge, driving clean < 0 with a NULL result tree.
+ onto_tree=$(git rev-parse onto^{tree}) &&
+ obj=$(test_oid_to_path "$onto_tree") &&
+ mv .git/objects/${obj} saved-tree &&
+
+ # Ensure replay gracefully handles the missing object
+ test_must_fail git replay --onto onto base..side 2>err &&
+ test_grep ! "[Ss]egmentation" err &&
+ test_grep "Could not read\|collecting merge info failed" err
+ )
+'
+
test_done
--
gitgitgadget
next prev parent reply other threads:[~2026-08-18 22:34 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-18 22:34 [PATCH 0/2] Objects treated as missing despite being present, due to race with geometric repacking Elijah Newren via GitGitGadget
2026-08-18 22:34 ` Elijah Newren via GitGitGadget [this message]
2026-08-18 22:34 ` [PATCH 2/2] packfile: recover when a multi-pack-index names a removed pack Elijah Newren via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=321af575e0a9e0c22c70c1809f6fbf0265b05d4c.1787092446.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=newren@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.