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