Jeff King <peff@xxxxxxxx> writes: >> diff --git a/entry.c b/entry.c >> index 5dab656364..2252d96756 100644 >> --- a/entry.c >> +++ b/entry.c >> @@ -355,7 +355,8 @@ 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("unable to get status of file %s", ce->name); > > 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. To tie the loose end, here is what will be queued and merged to 'next' soonish. Thanks. -- >8 -- From: Lars Schneider <larsxschneider@xxxxxxxxx> 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. Reported-by: Jeff King <peff@xxxxxxxx> Signed-off-by: Lars Schneider <larsxschneider@xxxxxxxxx> Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- entry.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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); fill_stat_cache_info(ce, &st); ce->ce_flags |= CE_UPDATE_IN_BASE; state->istate->cache_changed |= CE_ENTRY_CHANGED; -- 2.15.0-rc0-155-g07e9c1a78d