From 92fda79ed048d2d37e760e7a1b6055b2fc801ee3 Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Wed, 12 Jan 2011 20:26:36 -0600 Subject: [PATCH] unpack-trees: handle lstat failure for existing directory When check_leading_path notices no file in the way of the new entry to be checked out, verify_absent checks whether there is a directory there or nothing at all. If that lstat call fails (for example due to ENOMEM), it assumes ENOENT, meaning a directory with untracked files would be clobbered in that case. Check errno after calling lstat, and for conditions other than ENOENT, just error out. This is a theoretical race condition. lstat has to succeed moments before it fails for there to be trouble. Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- unpack-trees.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/unpack-trees.c b/unpack-trees.c index d5a453079a..3011d9b904 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1197,12 +1197,16 @@ static int verify_absent_1(struct cache_entry *ce, return check_ok_to_remove(path, len, DT_UNKNOWN, NULL, &st, error_type, o); - } else if (!lstat(ce->name, &st)) + } else if (lstat(ce->name, &st)) { + if (errno != ENOENT) + return error("cannot stat '%s': %s", ce->name, + strerror(errno)); + return 0; + } else { return check_ok_to_remove(ce->name, ce_namelen(ce), - ce_to_dtype(ce), ce, &st, - error_type, o); - - return 0; + ce_to_dtype(ce), ce, &st, + error_type, o); + } } static int verify_absent(struct cache_entry *ce,