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

Re: [PATCH v1 2/2] entry.c: check if file exists after checkout

From
Jeff King <peff@peff.net>
Date
Oct 6, 2017, 04:56 UTC
Message-ID
<20171006045640.vihagnlnuximzmjs@sigill.intra.peff.net>
In-Reply-To
<xmqqlgkoyk8n.fsf@gitster.mtv.corp.google.com>
On Fri, Oct 06, 2017 at 01:26:48PM +0900, Junio C Hamano wrote:
Show 12 quoted lines
> > We could probably be a bit more specific about the situation, since the
> > user will see this message with no context. Maybe something like:
> >
> >   unable to stat just-written file %s
> >
> > or something. We should probably also use error_errno(). I'd bet if this
> > ever triggers that it's likely to be ENOENT, but certainly if it _isn't_
> > that would be interesting information.
> 
> ENOTDIR and to a lesser degree EACCES and ELOOP are also
> uninteresting, as we are talking about somebody else mucking with
> the filesystem.

True. The nice thing about the error() route is that we don't need to make such judgements. The user can decide what is unexpected.

Show 9 quoted lines
> -- >8 --
> From: Lars Schneider <larsxschneider@gmail.com>
> Date: Thu, 5 Oct 2017 12:44:07 +0200
> Subject: [PATCH] entry.c: check if file exists after checkout
> 
> If we are checking out a file and somebody else racily deletes our file,
> then we would write garbage to the cache entry. Fix that by checking
> the result of the lstat() call on that file. Print an error to the user
> if the file does not exist.

I don't know if we wanted to capture any of the reasoning behind using error() here or not. Frankly, I'm not sure how to argue for it succinctly. :) I'm happy with letting it live on in the list archive.

Show 12 quoted lines
> diff --git a/entry.c b/entry.c
> index f879758c73..6d9de3a5aa 100644
> --- a/entry.c
> +++ b/entry.c
> @@ -341,7 +341,9 @@ static int write_entry(struct cache_entry *ce,
>  	if (state->refresh_cache) {
>  		assert(state->istate);
>  		if (!fstat_done)
> -			lstat(ce->name, &st);
> +			if (lstat(ce->name, &st) < 0)
> +				return error_errno("unable stat just-written file %s",
> +						   ce->name);
s/unable stat/unable to stat/, I think.
Other than that, this looks fine to me.
-Peff
Previous: Junio C HamanoNext: Junio C Hamano
Message 5 of 26 in “fix temporary garbage in the cache entry”
  1. 0/2 fix temporary garbage in the cache entrylars.schneider@autodesk.com, Oct 5, 2017
  2. 2/2 entry.c: check if file exists after checkoutlars.schneider@autodesk.com, Oct 5, 2017
  3. Jeff KingOct 5, 2017
  4. Junio C HamanoOct 6, 2017
  5. Jeff KingOct 6, 2017
  6. Junio C HamanoOct 6, 2017
  7. Jeff KingOct 6, 2017
  8. Junio C HamanoOct 6, 2017
  9. Lars SchneiderOct 8, 2017
  10. 1/2 entry.c: update cache entry only for existing fileslars.schneider@autodesk.com, Oct 5, 2017
  11. Jeff KingOct 5, 2017
  12. Junio C HamanoOct 5, 2017
  13. Jeff KingOct 5, 2017
  14. Junio C HamanoOct 5, 2017
  15. Jeff KingOct 6, 2017
  16. Lars SchneiderOct 8, 2017
  17. Jeff KingOct 9, 2017
  18. 1/3 write_entry: fix leak when retrying delayed filterJeff King, Oct 9, 2017
  19. Junio C HamanoOct 10, 2017
  20. Simon RuderichOct 10, 2017
  21. Jeff KingOct 10, 2017
  22. Simon RuderichOct 10, 2017
  23. 2/3 write_entry: avoid reading blobs in CE_RETRY caseJeff King, Oct 9, 2017
  24. Junio C HamanoOct 10, 2017
  25. 3/3 write_entry: untangle symlink and regular-file casesJeff King, Oct 9, 2017
  26. Junio C HamanoOct 10, 2017

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.