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

Re: Segfault in git merge-tree (1.8.2.2)

From
John Keeping <john@keeping.me.uk>
Date
May 6, 2013, 14:29 UTC
Message-ID
<20130506142923.GC25912@serenity.lan>
In-Reply-To
<CADEJa-5-UpkUaNQ=QResY54cH4TvXqiUSeG-jewH+n+HsZqmHA@mail.gmail.com>
On Mon, May 06, 2013 at 04:13:28PM +0200, Andreas Jacobsen wrote:
Show 21 quoted lines
> Sure, here you go, this time built from the HEAD I found on github
> (7d3ccdffb5d28970dd7a4d177cfcca690ccd0c22) with:
> 
> NO_GETTEXT=1 make prefix=/usr/local/Cellar/git/HEAD CC=cc CFLAGS='-O0
> -g' install (this is homebrew's setup, but I built it manually rather
> than using the recipe.)
> 
> And the gdb output:
> 
> (gdb) set args merge-tree 027058e6ac8d03e029c4e1455bf90f63cd20e65b
> FETCH_HEAD master
> (gdb) run
> Starting program: /usr/local/bin/git merge-tree
> 027058e6ac8d03e029c4e1455bf90f63cd20e65b FETCH_HEAD master
> Reading symbols for shared libraries +++++.............................. done
> 
> Program received signal EXC_BAD_ACCESS, Could not access memory.
> Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000
> 0x000000010006f1a3 in add_merge_entry (entry=0x100432ba0) at
> builtin/merge-tree.c:24
> 24 *merge_result_end = entry;

Thanks. I have an idea of what's going on, but the set up is in an earlier pass and it only fails the next time it gets into add_merge_entry.

Can you try adding the following patch on top? Hopefully the added debug is in the right caller, otherwise the new assert at the top will point us to the right one.

-- >8 --
diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c
index ec49917..8eebab7 100644
--- a/builtin/merge-tree.c
+++ b/builtin/merge-tree.c
@@ -23,6 +23,7 @@ static void add_merge_entry(struct merge_list *entry)
 {
 	*merge_result_end = entry;
 	merge_result_end = &entry->next;
+	assert(merge_result_end);
 }
 
 static void merge_trees_recursive(struct tree_desc t[3], const char *base, int df_conflict);
@@ -267,6 +268,12 @@ static void unresolved(const struct traverse_info *info, struct name_entry n[3])
 	if (n[0].mode && !S_ISDIR(n[0].mode))
 		entry = link_entry(1, info, n + 0, entry);
 
+	if (!entry) {
+		fprintf(stderr, "n[0].mode = %d\nn[1].mode = %d\nn[2].mode = %d\n",
+			n[0].mode, n[1].mode, n[2].mode);
+		assert(FALSE);
+	}
+
 	add_merge_entry(entry);
 }
 
Previous: Andreas JacobsenNext: John Keeping
Message 4 of 8 in “Segfault in git merge-tree (1.8.2.2)”
  1. Andreas JacobsenMay 6, 2013
  2. John KeepingMay 6, 2013
  3. Andreas JacobsenMay 6, 2013
  4. John KeepingMay 6, 2013
  5. John KeepingMay 6, 2013
  6. merge-tree: handle directory/empty conflict correctlyJohn Keeping, May 6, 2013
  7. Andreas JacobsenMay 7, 2013
  8. Junio C HamanoMay 7, 2013

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.