[PATCH] merge-tree: handle directory/empty conflict correctly

2013-05-06 Thread John Keeping
git-merge-tree causes a null pointer dereference when a directory
entry exists in only one or two of the three trees being compared with
no corresponding entry in the other tree(s).

When this happens, we want to handle the entry as a directory and not
attempt to mark it as a file merge.  Do this by setting the entries bit
in the directory mask when the entry is missing or when it is a
directory, only performing the file comparison when we know that a file
entry exists.

Reported-by: Andreas Jacobsen andr...@andreasjacobsen.com
Signed-off-by: John Keeping j...@keeping.me.uk
---
Andreas, can you try this patch and see if it fixes your test case?

 builtin/merge-tree.c  |  6 +-
 t/t4300-merge-tree.sh | 51 +++
 2 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c
index ec49917..61cbde4 100644
--- a/builtin/merge-tree.c
+++ b/builtin/merge-tree.c
@@ -251,7 +251,11 @@ static void unresolved(const struct traverse_info *info, 
struct name_entry n[3])
 
for (i = 0; i  3; i++) {
mask |= (1  i);
-   if (n[i].mode  S_ISDIR(n[i].mode))
+   /*
+* Treat missing entries as directories so that we return
+* after unresolved_directory has handled this.
+*/
+   if (!n[i].mode || S_ISDIR(n[i].mode))
dirmask |= (1  i);
}
 
diff --git a/t/t4300-merge-tree.sh b/t/t4300-merge-tree.sh
index 2defb42..9015e47 100755
--- a/t/t4300-merge-tree.sh
+++ b/t/t4300-merge-tree.sh
@@ -259,6 +259,57 @@ EXPECTED
test_cmp expected actual
 '
 
+test_expect_success 'tree add A, B (same)' '
+   cat expect -\EOF 
+   EOF
+   git reset --hard initial 
+   mkdir sub 
+   test_commit add sub/file sub/file file add-tree-A 
+   git merge-tree initial add-tree-A add-tree-A actual 
+   test_cmp expect actual
+'
+
+test_expect_success 'tree add A, B (different)' '
+   cat expect -\EOF 
+   added in both
+ our100644 43d5a8ed6ef6c00ff775008633f95787d088285d sub/file
+ their  100644 ba629238ca89489f2b350e196ca445e09d8bb834 sub/file
+   @@ -1 +1,5 @@
+   + .our
+AAA
+   +===
+   +BBB
+   + .their
+   EOF
+   git reset --hard initial 
+   mkdir sub 
+   test_commit add sub/file sub/file AAA add-tree-a-b-A 
+   git reset --hard initial 
+   mkdir sub 
+   test_commit add sub/file sub/file BBB add-tree-a-b-B 
+   git merge-tree initial add-tree-a-b-A add-tree-a-b-B actual 
+   test_cmp expect actual
+'
+
+test_expect_success 'tree unchanged A, removed B' '
+   cat expect -\EOF 
+   removed in remote
+ base   100644 43d5a8ed6ef6c00ff775008633f95787d088285d sub/file
+ our100644 43d5a8ed6ef6c00ff775008633f95787d088285d sub/file
+   @@ -1 +0,0 @@
+   -AAA
+   EOF
+   git reset --hard initial 
+   mkdir sub 
+   test_commit add sub/file sub/file AAA tree-remove-b-initial 
+   git rm sub/file 
+   test_tick 
+   git commit -m remove sub/file 
+   git tag tree-remove-b-B 
+   git merge-tree tree-remove-b-initial tree-remove-b-initial 
tree-remove-b-B actual 
+   test_cmp expect actual
+'
+
 test_expect_success 'turn file to tree' '
git reset --hard initial 
rm initial-file 
-- 
1.8.3.rc0.149.g98a72f2.dirty

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] merge-tree: handle directory/empty conflict correctly

2013-05-06 Thread Andreas Jacobsen
On 6 May 2013 17:20, John Keeping j...@keeping.me.uk wrote:
 Andreas, can you try this patch and see if it fixes your test case?

Worked perfectly. Thank you, John :)
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] merge-tree: handle directory/empty conflict correctly

2013-05-06 Thread Junio C Hamano
Andreas Jacobsen andr...@andreasjacobsen.com writes:

 On 6 May 2013 17:20, John Keeping j...@keeping.me.uk wrote:
 Andreas, can you try this patch and see if it fixes your test case?

 Worked perfectly. Thank you, John :)

Thanks, both.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html