[PATCH 4/5] Make 'diff_populate_filespec()' use the new 'strbuf_readlink()'
- From
Linus Torvalds <torvalds@linux-foundation.org>
- Date
- Dec 17, 2008, 18:44 UTC
- Message-ID
- <alpine.LFD.2.00.0812171043440.14014@localhost.localdomain>
- In-Reply-To
- <alpine.LFD.2.00.0812171043180.14014@localhost.localdomain>
From: Linus Torvalds <torvalds@linux-foundation.org> Date: Wed, 17 Dec 2008 10:26:13 -0800
This makes all tests pass on a system where 'lstat()' has been hacked to return bogus data in st_size for symlinks.
Of course, the test coverage isn't complete, but it's a good baseline.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> --- diff.c | 16 +++++++--------- 1 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/diff.c b/diff.c index afefe08..4b2029c 100644 --- a/diff.c +++ b/diff.c @@ -1773,19 +1773,17 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only) s->size = xsize_t(st.st_size); if (!s->size) goto empty; - if (size_only) - return 0; if (S_ISLNK(st.st_mode)) { - int ret; - s->data = xmalloc(s->size); - s->should_free = 1; - ret = readlink(s->path, s->data, s->size); - if (ret < 0) { - free(s->data); + struct strbuf sb = STRBUF_INIT; + + if (strbuf_readlink(&sb, s->path, s->size)) goto err_empty; - } + s->data = strbuf_detach(&sb, &s->size); + s->should_free = 1; return 0; } + if (size_only) + return 0; fd = open(s->path, O_RDONLY); if (fd < 0) goto err_empty;
-- 1.6.1.rc3.3.gcc3e3