Code

xdl_merge(): fix a segmentation fault when refining conflicts
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>
Thu, 28 Dec 2006 16:13:33 +0000 (17:13 +0100)
committerJunio C Hamano <junkio@cox.net>
Thu, 28 Dec 2006 21:59:39 +0000 (13:59 -0800)
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>
Signed-off-by: Junio C Hamano <junkio@cox.net>
t/t6023-merge-file.sh
xdiff/xmerge.c

index 5d9b6f34b84dd798f180d181aff4a7857bcd93ef..1c21d8c986fba2c287ffab0b883b65a14cb5401f 100644 (file)
@@ -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
 
index 352207e5168135f3c6306968f03a8d191d6ac2bb..294450b89916180ab603d566e7d3f281773a3b92 100644 (file)
@@ -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.