Re: [BUGREPORT] git diff-tree --cc SEGFAUTs
- From
Jeff King <peff@peff.net>
- Date
- Jan 3, 2025, 20:46 UTC
- Message-ID
- <20250103204624.GE3212696@coredump.intra.peff.net>
- In-Reply-To
- <CAKk8isqpAXLoiXxOP3uAc00M+OM0FaU3Uhnt5R1FnFMD=xGARg@mail.gmail.com>
On Fri, Jan 03, 2025 at 11:28:47AM -0800, Wink Saville wrote:
> `git diff-tree --cc` SEGFAUTs after adding trace_printf to diff_tree_combined.
Hmm, is it really a bug in Git if you had to add new code which contains the bug? :)
Show 12 quoted lines
> @@ -1595,8 +1597,16 @@ void diff_tree_combined(const struct object_id *oid,
> }
>
> /* find out number of surviving paths */
> - for (num_paths = 0, p = paths; p; p = p->next)
> + trace_printf("Wink diff_tree_combined: find number of surviving paths num_parent=%d\n", num_parent);
> + for (num_paths = 0, p = paths; p; p = p->next) {
> + trace_printf("Wink diff_tree_combined: num_paths=%d &p=%p mode=%0x, oid=%s path=%s\n", num_paths, p, p->mode, oid_to_hex(&p->oid), p->path);
> + for (i = 0; i < num_parent; i++) {
> + trace_printf("Wink diff_tree_combined: &p->parent[%d]=%p status=%c mode=%x oid=%s path.buf=%p contents path.buf=%s\n",
> + i, &p->parent[i], p->parent[i].status, p->parent[i].mode, oid_to_hex(&p->parent[i].oid), p->parent[i].path.buf, p->parent[i].path.buf);
> + }The parent "path" strbufs are only initialized in intersect_paths() if combined_all_paths is set, and if there was an actual path change (a copy or rename).
So you'd probably need something like this:
diff --git a/combine-diff.c b/combine-diff.c index 455bc19087..1e58809c4e 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -1601,8 +1601,11 @@ void diff_tree_combined(const struct object_id *oid, for (num_paths = 0, p = paths; p; p = p->next) { trace_printf("Wink diff_tree_combined: num_paths=%d &p=%p mode=%0x, oid=%s path=%s\n", num_paths, p, p->mode, oid_to_hex(&p->oid), p->path); for (i = 0; i < num_parent; i++) { + const char *path = rev->combine_all_paths && + filename_changed(p->parent[i].status) ? + p->parent[i].path.buf : NULL; trace_printf("Wink diff_tree_combined: &p->parent[%d]=%p status=%c mode=%x oid=%s path.buf=%p contents path.buf=%s\n", - i, &p->parent[i], p->parent[i].status, p->parent[i].mode, oid_to_hex(&p->parent[i].oid), p->parent[i].path.buf, p->parent[i].path.buf); + i, &p->parent[i], p->parent[i].status, p->parent[i].mode, oid_to_hex(&p->parent[i].oid), path, path); } num_paths++; } -Peff