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

Re: [PATCH 1/1] commit-reach: properly peel tags

From
Jeff King <peff@peff.net>
Date
Sep 12, 2018, 19:41 UTC
Message-ID
<20180912194130.GA22146@sigill.intra.peff.net>
In-Reply-To
<948e222228d2f2868b85a425142382e63a17773a.1536762173.git.gitgitgadget@gmail.com>
On Wed, Sep 12, 2018 at 07:22:56AM -0700, Derrick Stolee via GitGitGadget wrote:
Show 10 quoted lines
> From: Derrick Stolee <dstolee@microsoft.com>
> 
> The can_all_from_reach_with_flag() algorithm was refactored in 4fbcca4e
> "commit-reach: make can_all_from_reach... linear" but incorrectly
> assumed that all objects provided were commits. During a fetch
> negotiation, ok_to_give_up() in upload-pack.c may provide unpeeled tags
> to the 'from' array. The current code creates a segfault.
> 
> Add a direct call to can_all_from_reach_with_flag() in 'test-tool reach'
> and add a test in t6600-test-reach.sh that demonstrates this segfault.

Thanks, that makes a lot of sense for reproducing. I almost wonder if the whole X_array of commits in test-reach could just go away, and we'd feed whatever list of objects the caller happens to send. That may make it simpler to include non-commit objects in a variety of tests.

That said, I didn't look closely at other fallout in the program from that, so I'll defer to your judgement.

> Correct the issue by peeling tags when investigating the initial list
> of objects in the 'from' array.
> 
> Signed-off-by: Jeff King <peff@peff.net>

I'm not sure if this should just be Reported-by, since I don't know that I actually contributed any code. ;) But for anything I might have contributed, certainly you have my signoff.

Show 13 quoted lines
>  	for (i = 0; i < from->nr; i++) {
> -		list[i] = (struct commit *)from->objects[i].item;
> +		struct object *from_one = from->objects[i].item;
>  
> -		if (parse_commit(list[i]) ||
> -		    list[i]->generation < min_generation)
> -			return 0;
> +		from_one = deref_tag(the_repository, from_one,
> +				     "a from object", 0);
> +		if (!from_one || from_one->type != OBJ_COMMIT) {
> +			from->objects[i].item->flags |= assign_flag;
> +			continue;
> +		}

I didn't resurrect the comment from this conditional that was in the original code (mostly because I wasn't sure if the reasoning was still entirely valid, or what setting the flag here actually means). But it's probably worth saying something here to explain why it's OK to punt on this case, and what it means to just set the flag.

> [...]

The rest of the patch looks sane to me. I didn't go through the trouble to reproduce the segfault with the test, but it sounds like you did.

-Peff
Previous: Derrick Stolee via GitGitGadgetNext: Junio C Hamano
Message 3 of 25 in “Properly peel tags in can_all_from_reach_with_flags()”
  1. 0/1 Properly peel tags in can_all_from_reach_with_flags()Derrick Stolee via GitGitGadget, Sep 12, 2018
  2. 1/1 commit-reach: properly peel tagsDerrick Stolee via GitGitGadget, Sep 12, 2018
  3. Jeff KingSep 12, 2018
  4. Junio C HamanoSep 12, 2018
  5. Jeff KingSep 12, 2018
  6. 0/1 Properly peel tags in can_all_from_reach_with_flags()Derrick Stolee via GitGitGadget, Sep 13, 2018
  7. 1/1 commit-reach: properly peel tagsDerrick Stolee via GitGitGadget, Sep 13, 2018
  8. Derrick StoleeSep 13, 2018
  9. Junio C HamanoSep 13, 2018
  10. 0/2 Properly peel tags in can_all_from_reach_with_flags()Derrick Stolee via GitGitGadget, Sep 21, 2018
  11. 1/2 commit-reach: properly peel tagsDerrick Stolee via GitGitGadget, Sep 21, 2018
  12. Jeff KingSep 21, 2018
  13. Derrick StoleeSep 24, 2018
  14. 2/2 commit-reach: fix memory and flag leaksDerrick Stolee via GitGitGadget, Sep 21, 2018
  15. Jeff KingSep 21, 2018
  16. Derrick StoleeSep 24, 2018
  17. Jeff KingSep 24, 2018
  18. 0/1 Properly peel tags in can_all_from_reach_with_flags()Derrick Stolee via GitGitGadget, Sep 24, 2018
  19. 1/1 commit-reach: properly peel tags and clear flagsDerrick Stolee via GitGitGadget, Sep 24, 2018
  20. Jeff KingSep 24, 2018
  21. Eric SunshineSep 25, 2018
  22. commit-reach: cleanups in can_all_from_reach...Derrick Stolee, Sep 25, 2018
  23. Junio C HamanoSep 25, 2018
  24. Derrick StoleeSep 25, 2018
  25. Junio C HamanoSep 25, 2018

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.