@matheusbsbs / matheus-bagliano / commits / b760d3aa74
Fork 0

Make 'index_path()' use 'strbuf_readlink()'

This makes us able to properly index symlinks even on filesystems where st_size doesn't match the true size of the link. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Linus Torvalds committed Dec 17, 2008 at 09:51 UTC b760d3aa74585a96f0ccc4ce0374528a38be5177
1 file changed +5 -9
sha1_file.c
+5 -9
@@ -2523,8 +2523,7 @@ int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object,
2523 int index_path(unsigned char *sha1, const char *path, struct stat *st, int write_object)
2524 {
2525 int fd;
2526 - char *target;
2527 - size_t len;
2526 + struct strbuf sb = STRBUF_INIT;
2527
2528 switch (st->st_mode & S_IFMT) {
2529 case S_IFREG:
@@ -2537,20 +2536,17 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, int write
2536 path);
2537 break;
2538 case S_IFLNK:
2540 - len = xsize_t(st->st_size);
2541 - target = xmalloc(len + 1);
2542 - if (readlink(path, target, len + 1) != st->st_size) {
2539 + if (strbuf_readlink(&sb, path, st->st_size)) {
2540 char *errstr = strerror(errno);
2544 - free(target);
2541 return error("readlink(\"%s\"): %s", path,
2542 errstr);
2543 }
2544 if (!write_object)
2549 - hash_sha1_file(target, len, blob_type, sha1);
2550 - else if (write_sha1_file(target, len, blob_type, sha1))
2545 + hash_sha1_file(sb.buf, sb.len, blob_type, sha1);
2546 + else if (write_sha1_file(sb.buf, sb.len, blob_type, sha1))
2547 return error("%s: failed to insert into database",
2548 path);
2553 - free(target);
2549 + strbuf_release(&sb);
2550 break;
2551 case S_IFDIR:
2552 return resolve_gitlink_ref(path, "HEAD", sha1);