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

Re: [PATCH 2/6] diff: clear emitted_symbols flag after use

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 24, 2019, 20:18 UTC
Message-ID
<xmqqy379hkri.fsf@gitster-ct.c.googlers.com>
In-Reply-To
<20190124123240.GB11354@sigill.intra.peff.net>
Jeff King <peff@peff.net> writes:
Show 11 quoted lines
> When we run "git log --cc --stat -p --color-moved" starting at D, we get
> this sequence of events:
>
>   1. The diff for D is using -p, so diff_flush() calls into
>      diff_flush_patch_all_file_pairs(). There we see that o->color_moved
>      is in effect, so we point o->emitted_symbols to a static local
>      struct, causing diff_flush_patch() to queue the symbols instead of
>      actually writing them out.
>
>      We then do our move detection, emit the symbols, and clear the
>      struct. But we leave o->emitted_symbols pointing to our struct.
Wow, that was nasty.  

I did not like the complexity of that "emitted symbols" conversion we had to do recently and never trusted the code. There still is something funny in diff_flush_patch_all_file_pairs() even after this patch, though.

 - We first check o->color_moved and unconditionally point
   o->emitted_symbols to &esm.
 - In an if() block we enter when o->emitted_symbols is set, there
   is a check to see if o->color_moved is set.  This makes sense
   only if we are trying to be prepared to handle a case where we
   are not the one that assigned a non-NULL to o->emitted_symbols
   due to o->color_moved.  So it certainly is possible that
   o->emitted_symbols is set before we enter this function.
 - But then, it means that o->emitted_symbols we may have had
   non-NULL when the function is called may be overwritten if
   o->color_moved is set.

The above observation does not necessarily indicate any bug; it just shows that the code structure is messier than necessary.

Show 5 quoted lines
> To fix it, we can simply restore o->emitted_symbols to NULL after
> flushing it, so that it does not affect anything outside of
> diff_flush_patch_all_file_pairs(). This intuitively makes sense, since
> nobody outside of that function is going to bother flushing it, so we
> would not want them to write to it either.

Perhaps. I see word-diff codepath gives an allocated buffer to o->emitted_symbols, so assigning NULL without freeing would mean a leak, but I guess this helper function is not designed to be called

Previous: Jeff KingNext: Stefan Beller
Message 7 of 19 in “some diff --cc --stat fixes”
  1. 0/6 some diff --cc --stat fixesJeff King, Jan 24, 2019
  2. 1/6 t4006: resurrect commented-out testsJeff King, Jan 24, 2019
  3. Stefan BellerJan 24, 2019
  4. 2/6 diff: clear emitted_symbols flag after useJeff King, Jan 24, 2019
  5. Stefan BellerJan 24, 2019
  6. Jeff KingJan 24, 2019
  7. Junio C HamanoJan 24, 2019
  8. Stefan BellerJan 24, 2019
  9. Jeff KingJan 24, 2019
  10. Jeff KingJan 24, 2019
  11. 3/6 combine-diff: factor out stat-format maskJeff King, Jan 24, 2019
  12. 4/6 combine-diff: treat --shortstat like --statJeff King, Jan 24, 2019
  13. David TurnerJan 24, 2019
  14. Stefan BellerJan 24, 2019
  15. 5/6 combine-diff: treat --summary like --statJeff King, Jan 24, 2019
  16. Stefan BellerJan 24, 2019
  17. Jeff KingJan 24, 2019
  18. 6/6 combine-diff: treat --dirstat like --statJeff King, Jan 24, 2019
  19. Stefan BellerJan 24, 2019

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.