Skip to content

Commit

Permalink
unpack-trees: handle lstat failure for existing file
Browse files Browse the repository at this point in the history
When check_leading_path notices a file in the way of a new entry to be
checked out, verify_absent uses (1) the mode to determine whether it
is a directory (2) the rest of the stat information to check if this
is actually an old entry, disguised by a change in filename (e.g.,
README -> Readme) that is significant to git but insignificant to the
underlying filesystem.  If lstat fails, these checks are performed
with an uninitialied stat structure, producing essentially random
results.

Better to just error out when lstat fails.

The easiest way to reproduce this is to remove a file after the
check_leading_path call and before the lstat in verify_absent.  An
lstat failure other than ENOENT in check_leading_path would also
trigger the same code path.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jonathan Nieder authored and Junio C Hamano committed Jan 13, 2011
1 parent 92fda79 commit a93e530
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion unpack-trees.c
Original file line number Diff line number Diff line change
Expand Up @@ -1193,7 +1193,9 @@ static int verify_absent_1(struct cache_entry *ce,
char path[PATH_MAX + 1];
memcpy(path, ce->name, len);
path[len] = 0;
lstat(path, &st);
if (lstat(path, &st))
return error("cannot stat '%s': %s", path,
strerror(errno));

return check_ok_to_remove(path, len, DT_UNKNOWN, NULL, &st,
error_type, o);
Expand Down

0 comments on commit a93e530

Please sign in to comment.