Re: Unable to index file
- From
Linus Torvalds <torvalds@linux-foundation.org>
- Date
- Dec 12, 2008, 18:15 UTC
- Message-ID
- <alpine.LFD.2.00.0812121013560.3340@localhost.localdomain>
- In-Reply-To
- <alpine.LFD.2.00.0812120956050.3340@localhost.localdomain>
On Fri, 12 Dec 2008, Linus Torvalds wrote:
Show 5 quoted lines
> > Now, admittedly git is probably being really annoyingly anal about this > all, and we probably should loosen the restrictions on it a bit, but I'd > like to know why it happens. I cannot recall this having been reported > before, so it's some specific filesystem or OS that causes this, I think.
Anyway, the "loosen the symlink lstat() requirements" patch would likely look something like this. I can't really test it, though, since I only have filesystems that have matching lstat()/readlink() sizes.
Linus --- sha1_file.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/sha1_file.c b/sha1_file.c index 0e021c5..222c793 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2522,9 +2522,9 @@ int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object, int index_path(unsigned char *sha1, const char *path, struct stat *st, int write_object) { - int fd; + int fd, len; char *target; - size_t len; + size_t bufsize; switch (st->st_mode & S_IFMT) { case S_IFREG: @@ -2537,9 +2537,10 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, int write path); break; case S_IFLNK: - len = xsize_t(st->st_size); - target = xmalloc(len + 1); - if (readlink(path, target, len + 1) != st->st_size) { + bufsize = 1+xsize_t(st->st_size); + target = xmalloc(bufsize); + len = readlink(path, target, bufsize); + if (len < 0) { char *errstr = strerror(errno); free(target); return error("readlink(\"%s\"): %s", path,