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);