git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] xdl_merge(): fix a segmentation fault when refining conflicts

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Dec 28, 2006, 16:13 UTC
Message-ID
<Pine.LNX.4.63.0612281710350.19693@wbgn013.biozentrum.uni-wuerzburg.de>
In-Reply-To
<87fyb11ouy.fsf@wine.dyndns.org>

The function xdl_refine_conflicts() tries to break down huge conflicts by doing a diff on the conflicting regions. However, this does not make sense when one side is empty.

Worse, when one side is not only empty, but after EOF, the code accessed unmapped memory.

Noticed by Luben Tuikov, Shawn Pearce and Alexandre Julliard, the latter providing a test case.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
---
	Thank you Alexandre! I looked for the bug for quite some time, but 
	was never close to the real culprit.
 t/t6023-merge-file.sh |   22 ++++++++++++++++++++++
 xdiff/xmerge.c        |    4 ++++
 2 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/t/t6023-merge-file.sh b/t/t6023-merge-file.sh
index 5d9b6f3..1c21d8c 100644
--- a/t/t6023-merge-file.sh
+++ b/t/t6023-merge-file.sh
@@ -112,5 +112,27 @@ EOF
 test_expect_success "expected conflict markers, with -L" \
 	"diff -u test.txt expect.txt"
 
+sed "s/ tu / TU /" < new1.txt > new5.txt
+test_expect_failure "conflict in removed tail" \
+	"git-merge-file -p orig.txt new1.txt new5.txt > out"
+
+cat > expect << EOF
+Dominus regit me,
+et nihil mihi deerit.
+In loco pascuae ibi me collocavit,
+super aquam refectionis educavit me;
+animam meam convertit,
+deduxit me super semitas jusitiae,
+propter nomen suum.
+<<<<<<< orig.txt
+=======
+Nam et si ambulavero in medio umbrae mortis,
+non timebo mala, quoniam TU mecum es:
+virga tua et baculus tuus ipsa me consolata sunt.
+>>>>>>> new5.txt
+EOF
+
+test_expect_success "expected conflict markers" "diff -u expect out"
+
 test_done
 
diff --git a/xdiff/xmerge.c b/xdiff/xmerge.c
index 352207e..294450b 100644
--- a/xdiff/xmerge.c
+++ b/xdiff/xmerge.c
@@ -190,6 +190,10 @@ static int xdl_refine_conflicts(xdfenv_t *xe1, xdfenv_t *xe2, xdmerge_t *m,
 		if (m->mode)
 			continue;
 
+		/* no sense refining a conflict when one side is empty */
+		if (m->chg1 == 0 || m->chg2 == 0)
+			continue;
+
 		/*
 		 * This probably does not work outside git, since
 		 * we have a very simple mmfile structure.
-- 
1.5.0.rc0.g09372-dirty
Previous: Alexandre JulliardNext: Junio C Hamano
Message 6 of 15 in “Segfault in xdl_merge is back”
  1. Shawn PearceDec 27, 2006
  2. Linus TorvaldsDec 27, 2006
  3. Shawn PearceDec 27, 2006
  4. Johannes SchindelinDec 27, 2006
  5. Alexandre JulliardDec 27, 2006
  6. xdl_merge(): fix a segmentation fault when refining conflictsJohannes Schindelin, Dec 28, 2006
  7. Junio C HamanoDec 28, 2006
  8. Shawn PearceDec 29, 2006
  9. Johannes SchindelinDec 30, 2006
  10. Jakub NarebskiDec 30, 2006
  11. Johannes SchindelinDec 31, 2006
  12. Jakub NarebskiJan 2, 2007
  13. Johannes SchindelinJan 2, 2007
  14. Junio C HamanoJan 2, 2007
  15. Johannes SchindelinJan 2, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.