diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-12-17 09:51:53 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-12-17 13:36:34 -0800 |
commit | b760d3aa74585a96f0ccc4ce0374528a38be5177 (patch) | |
tree | f67ad22604af71d2acd6e52bdb44e02ccd9e0d81 | |
parent | Make 'ce_compare_link()' use the new 'strbuf_readlink()' (diff) | |
download | tgif-b760d3aa74585a96f0ccc4ce0374528a38be5177.tar.xz |
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>
-rw-r--r-- | sha1_file.c | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/sha1_file.c b/sha1_file.c index 0e021c5eca..52d1ead15b 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2523,8 +2523,7 @@ 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; - char *target; - size_t len; + struct strbuf sb = STRBUF_INIT; switch (st->st_mode & S_IFMT) { case S_IFREG: @@ -2537,20 +2536,17 @@ 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) { + if (strbuf_readlink(&sb, path, st->st_size)) { char *errstr = strerror(errno); - free(target); return error("readlink(\"%s\"): %s", path, errstr); } if (!write_object) - hash_sha1_file(target, len, blob_type, sha1); - else if (write_sha1_file(target, len, blob_type, sha1)) + hash_sha1_file(sb.buf, sb.len, blob_type, sha1); + else if (write_sha1_file(sb.buf, sb.len, blob_type, sha1)) return error("%s: failed to insert into database", path); - free(target); + strbuf_release(&sb); break; case S_IFDIR: return resolve_gitlink_ref(path, "HEAD", sha1); |