summaryrefslogtreecommitdiff
path: root/unpack-trees.c
diff options
context:
space:
mode:
authorJonathan Nieder <jrnieder@gmail.com>2011-01-12 20:26:36 -0600
committerJunio C Hamano <gitster@pobox.com>2011-01-13 11:25:32 -0800
commit92fda79ed048d2d37e760e7a1b6055b2fc801ee3 (patch)
tree382f6ef92af09daecc40f37bf9fa4bb634beecea /unpack-trees.c
parent3f142468997f9d14d8051a96b2e9db265d41ac0d (diff)
downloadgit-92fda79ed048d2d37e760e7a1b6055b2fc801ee3.tar.gz
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 <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'unpack-trees.c')
-rw-r--r--unpack-trees.c14
1 files 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,