Re: [BUGREPORT] git diff-tree --cc SEGFAUTs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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? :)

> @@ -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




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux