Skip to content

Commit

Permalink
fscache: compute correct symlink size in lstat()
Browse files Browse the repository at this point in the history
In #2637, we fixed a bug
where symbolic links' target path sizes were recorded incorrectly in the
index.

However, we did so only in `mingw_lstat()` but not in `fscache_lstat()`.
Meaning: in code paths where the FSCache feature is enabled, Git _still_
got the wrong idea if the symbolic link target's length.

Let's fix this.

Note: as the FSCache feature reads in whole swaths of directory entries
in batch mode, even if metadata for only one of them might be required,
we save the expensive `CreateFile()` call that is required to compute
the symbolic link target's length to the `fscache_lstat()` call.

This fixes #2653.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
  • Loading branch information
dscho authored and Git for Windows Build Agent committed Jul 7, 2020
1 parent faaa857 commit 2fa7675
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions compat/win32/fscache.c
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,18 @@ int fscache_lstat(const char *filename, struct stat *st)
if (!fse)
return -1;

/*
* Special case symbolic links: FindFirstFile()/FindNextFile() did not
* provide us with the length of the target path.
*/
if (fse->u.s.st_size == MAX_LONG_PATH && S_ISLNK(fse->st_mode)) {
char buf[MAX_LONG_PATH];
int len = readlink(filename, buf, sizeof(buf) - 1);

if (len > 0)
fse->u.s.st_size = len;
}

/* copy stat data */
st->st_ino = 0;
st->st_gid = 0;
Expand Down

0 comments on commit 2fa7675

Please sign in to comment.