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>
This commit is contained in:
parent
3f14246899
commit
92fda79ed0
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user