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

[RFC/PATCH 0/8] Re: bug: git-bundle create foo --stdin -> segfault

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Jun 26, 2010, 06:17 UTC
Message-ID
<20100626061735.GA15881@burratino>
In-Reply-To
<20100119002641.GA31434@gnu.kitenet.net>
Joey Hess wrote:
> I noticed that git bundle --stdin actually attempts to read from stdin
> past EOF.

Patch 5 below fixes that. Sadly it is not the whole story and I had to introduce a memory leak for all users of --stdin to make ‘bundle --stdin’ actually work (patch 6).

In the case of bundle --stdin, I think the leak is unavoidable, while in general, I suspect a parameter is needed to allow the caller to indicate whether the leak is needed (analogous to save_commit_buffer).

The rest of the patches should be comparatively pleasant.

Patches 1, 3, and 4 give various parts of bundle creation their own functions, to make the code easier to digest;

Patch 2 teaches the basis discovery code (which currently forks a rev-list --boundary process) to use the revision walker directly, to prepare for patch 5.

Patch 5 looked like it would be the main point of the series: it saves the list of revs including those read from stdin and resets the revision walker after the boundary is found. This way, stdin is only read once and the underlying logic of the revision walk does not need to be changed significantly.

Even with patch 5, bundle --stdin still finds no revisions to read. The problem: to write the table of contents, the name passed on the command line for each ref is needed. Unfortunately, names passed through stdin are kept in a temporary buffer and then freed; the random gibberish read instead does not look like a meaningful ref name, so no valid toc entries are found.

Patch 6 fixes this, at the cost of a memory leak. Suggestions for avoiding the leak would of course be welcome.

Patch 7 adopts a similar “fix” in a context where it is not needed. This is just for illustration.

Patch 8 is an unrelated enhancement that came along the way.

Thanks to Joey for the report and Johannes for suggestions for fixing it.

Thoughts?  Tests to add?
Jonathan Nieder (8):
  bundle: split basis discovery into its own function
  bundle: use libified rev-list --boundary
  bundle: split body of list_prerequisites() loop into its own function
  bundle: split table of contents output into its own function
  bundle: reuse setup_revisions result
  revision: Keep ref names after reading them from stdin
  bundle: Keep names of basis refs after discovery
  bundle_create: Do not exit when given no revs to bundle
 bundle.c          |  172 ++++++++++++++++++++++++++++++++++-------------------
 revision.c        |    2 +-
 t/t5704-bundle.sh |    4 +-
 3 files changed, 113 insertions(+), 65 deletions(-)
Previous: Junio C HamanoNext: Jonathan Nieder
Message 7 of 19 in “bug: git-bundle create foo --stdin -> segfault”
  1. Joey HessJan 19, 2010
  2. Johannes SchindelinJan 19, 2010
  3. 0/2 test bundle --stdin, fix objects_array_remove_duplicates()Jonathan Nieder, Apr 19, 2010
  4. 1/2 t5704 (bundle): add tests for bundle --stdinJonathan Nieder, Apr 19, 2010
  5. 2/2 fix "bundle --stdin" segfaultJonathan Nieder, Apr 19, 2010
  6. Junio C HamanoApr 20, 2010
  7. 0/8 Re: bug: git-bundle create foo --stdin -> segfaultJonathan Nieder, Jun 26, 2010
  8. 1/8 bundle: split basis discovery into its own functionJonathan Nieder, Jun 26, 2010
  9. 2/8 bundle: use libified rev-list --boundaryJonathan Nieder, Jun 26, 2010
  10. Junio C HamanoJun 30, 2010
  11. Jonathan NiederJun 30, 2010
  12. 3/8 bundle: give list_prerequisites() loop body its own functionJonathan Nieder, Jun 26, 2010
  13. Junio C HamanoJun 30, 2010
  14. Jonathan NiederJun 30, 2010
  15. 4/8 bundle: split table of contents output into its own functionJonathan Nieder, Jun 26, 2010
  16. 5/8 bundle: reuse setup_revisions resultJonathan Nieder, Jun 26, 2010
  17. 6/8 Fix bundle --stdinJonathan Nieder, Jun 26, 2010
  18. 7/8 bundle: Keep names of basis refs after discoveryJonathan Nieder, Jun 26, 2010
  19. 8/8 bundle_create: Do not exit when given no revs to bundleJonathan Nieder, Jun 26, 2010

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.