All of
 help / color / mirror / Atom feed
From: BENTZ Sylvain <>
To: "" <>
Subject: Bug: Commit a merge resolution with non-closed conflict markers leads to errs, segfault
Date: Thu, 22 Jul 2021 09:28:13 +0000	[thread overview]
Message-ID: <> (raw)


I've stumbled on a segmentation fault while resolving merge conflicts.
Basically, I missed to remove some conflict markers, tried to commit the
(faulty) merge resolution, and Git mishandles that.

The original issue happened applying a patch using 3-way merge.  The minimal
working example below creates a conflict with a simple `git merge` command.

Thank you for filling out a Git bug report!
Please answer the following questions to help us understand your issue.

What did you do before the bug happened? (Steps to reproduce your issue)

1. Create a merge conflict
2. Edit the conflicted file, keep some conflict markers (more on that below [1])
3. Commit (works but errors are reported!)
4. Fix the file, by removing all conflict markers
5. Commit (works but segmentation fault!)
6. Commit again, with some changes or with an empty commit (fatal error!)

See shell script (MWE) below [2].

What did you expect to happen? (Expected behavior)

At step 3, Git should return an error without committing.

What happened instead? (Actual behavior)

Git works and breaks at the same time.
Step 3 : It throws error messages without returning an error, and it does commit.
Step 5 : It breaks (segfault), manages to commit, but fails to remove a lockfile.

See terminal output below [3].

Then, if I reset hard to the commit named "master", delete the lockfile, and
repeat the process, I still get errors in step 3, but no segfault in step 5.

What's different between what you expected and what actually happened?

Git shouldn't segfault obviously. See gdb output below [4].

Anything else you want to add:

Tested versions: 2.20 (debian stable), 2.32 (alpine 3.14), next (alpine 3.14)

[1] Some configurations of conflict markers triggers that bug, others don't.
    The minimal working example shows the case (A).

Failure cases:
(A)        (B)        (C)
<<<<<<<<<  <<<<<<<<<  <<<<<<<<<
           >>>>>>>>>  =========

Not failure cases:
(D)        (E)        (F)
=========  =========  >>>>>>>>>

[2] Shell script (MWE)

# Setup conflicting branches `master' and `conflict'

mkdir "$FOLDER"
cd "$FOLDER"
git init
echo '' > README
git add README
git commit -m "First commit"
echo master > README
git commit -i README -m "master"
git checkout -b conflict HEAD~
echo conflict > README
git commit -i README -m "conflict"
git checkout master

# Convenience functions

mer() { set -x; git merge conflict; }
com() { set -x; git add README; git commit -m "$1"; }
del() { set -x; for arg; do sed -i "/$arg/ d" README; done; cat README; }
see() { set -x; git log -p -n2; }

# Script

mer                  # Create a merge conflict
del = '>'            # Keep the conflict marker `<<<<<<<<<<<'
com "Merge commit"   # Commit (errors reported)
del '<'              # Fix by deleting the remaining marker
com "Fix the merge"  # Commit (segfault)
echo next >> README  # Do some changes...
com "next"           # Commit (fatal error)

[3] Terminal output

####### START TERMINAL OUTPUT ########

/git-min # see
+ see
+ set -x
+ git log -p -n2
commit 9a9dd03509b8cf45c8037c60c256d6ef67f9e431 (HEAD -> master)
Author: sylvain.bentz <>
Date:   Wed Jul 21 14:50:37 2021 +0200


diff --git a/README b/README
index 8b13789..1f7391f 100644
--- a/README
+++ b/README
@@ -1 +1 @@

commit cfb5d5cd9f28e1dcca7a1d1088405d8ec4ebf713
Author: sylvain.bentz <>
Date:   Wed Jul 21 14:49:36 2021 +0200

    First commit

diff --git a/README b/README
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/README
@@ -0,0 +1 @@

/git-min # mer
+ mer
+ set -x
+ git merge conflict
Auto-merging README
CONFLICT (content): Merge conflict in README
Recorded preimage for 'README'
Automatic merge failed; fix conflicts and then commit the result.

/git-min # del = '>'
+ del '=' '>'
+ set -x
+ sed -i '/=/ d' README
+ sed -i '/>/ d' README
+ cat README
<<<<<<< HEAD

/git-min # com merge
+ com merge
+ set -x
+ git add README
+ git commit -m merge
error: could not parse conflict hunks in 'README'
error: could not parse conflict hunks in 'README'
Recorded preimage for 'README'
[master ab6c525] merge

/git-min # del '<'
+ del '<'
+ set -x
+ sed -i '/</ d' README
+ cat README

/git-min # com mergefix
+ com mergefix
+ set -x
+ git add README
+ git commit -m mergefix
Segmentation fault

/git-min # see
+ see
+ set -x
+ git log -p -n2
commit 8ea1a55602ba5ae505b43f2ae3a49b3a9a26b2fe (HEAD -> master)
Author: Your Name <>
Date:   Wed Jul 21 15:38:35 2021 +0000


diff --git a/README b/README
index 59c1bc9..6ecc231 100644
--- a/README
+++ b/README
@@ -1,3 +1,2 @@
-<<<<<<< HEAD

commit ab6c52591506ac2e75745814527f062d767b4e11
Merge: 9a9dd03 42a166a
Author: Your Name <>
Date:   Wed Jul 21 15:38:18 2021 +0000


/git-min # echo 'next' >> README
+ echo next

/git-min # com next
+ com next
+ set -x
+ git add README
+ git commit -m next
fatal: Unable to create '/git-min/.git/MERGE_RR.lock': File exists.

Another git process seems to be running in this repository, e.g.
an editor opened by 'git commit'. Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue.

/git-min # git --version
+ git --version
git version

/git-min # git config --list
+ git config --list Name

####### END TERMINAL OUTPUT ########

[4] GDB Output

(gdb) run
Starting program: /usr/local/bin/git commit -m Fix\ the\ merge
warning: Error disabling address space randomization: Operation not permitted

Program received signal SIGSEGV, Segmentation fault.
0x000055dbdff61748 in do_rerere_one_path (update=0x7ffffce68720, rr_item=0x7f5ed8e20340,
    istate=0x55dbe00ef520 <the_index>) at rerere.c:736

Please review the rest of the bug report below.
You can delete any lines you don't wish to share.

[System Info]
git version:
git version
cpu: x86_64
built from commit: 1bb01aad6fdafaac7a11bed18a67384f28ab735b
sizeof-long: 8
sizeof-size_t: 8
shell-path: /bin/sh
uname: Linux 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 x86_64
compiler info: gnuc: 10.3
libc info: no libc information available
$SHELL (typically, interactive shell): <unset>

[Enabled Hooks]

             reply	other threads:[~2021-07-22  9:31 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-22  9:28 BENTZ Sylvain [this message]
2021-07-22 10:25 ` Felipe Contreras
2021-07-22 12:53   ` BENTZ Sylvain
2021-07-22 14:17     ` Ævar Arnfjörð Bjarmason

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:

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \ \ \ \
    --subject='Re: Bug: Commit a merge resolution with non-closed conflict markers leads to errs, segfault' \

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

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.