summaryrefslogtreecommitdiff
path: root/diff.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2008-12-17 22:28:03 -0800
committerJunio C Hamano <gitster@pobox.com>2008-12-17 22:28:03 -0800
commitc0ceb2c32d40c4bc835597105ba0c0fac4ae36ba (patch)
tree628e9b1a593ddd50ed1f33754d654aae3e30630b /diff.c
parent954597bd198f31e66ac39bea60cfdb8d1ced858c (diff)
parent912342d9d69a30e49491f3fd4d3aa8dc2f6050f3 (diff)
downloadgit-c0ceb2c32d40c4bc835597105ba0c0fac4ae36ba.tar.gz
Merge branch 'lt/readlink'
* lt/readlink: combine-diff.c: use strbuf_readlink() builtin-blame.c: use strbuf_readlink() make_absolute_path(): check bounds when seeing an overlong symlink Make 'prepare_temp_file()' ignore st_size for symlinks Make 'diff_populate_filespec()' use the new 'strbuf_readlink()' Make 'index_path()' use 'strbuf_readlink()' Make 'ce_compare_link()' use the new 'strbuf_readlink()' Add generic 'strbuf_readlink()' helper function
Diffstat (limited to 'diff.c')
-rw-r--r--diff.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/diff.c b/diff.c
index afefe087bb..f160c1a35b 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;
@@ -1883,13 +1881,12 @@ static void prepare_temp_file(const char *name,
if (S_ISLNK(st.st_mode)) {
int ret;
char buf[PATH_MAX + 1]; /* ought to be SYMLINK_MAX */
- size_t sz = xsize_t(st.st_size);
- if (sizeof(buf) <= st.st_size)
- die("symlink too long: %s", name);
- ret = readlink(name, buf, sz);
+ ret = readlink(name, buf, sizeof(buf));
if (ret < 0)
die("readlink(%s)", name);
- prep_temp_blob(temp, buf, sz,
+ if (ret == sizeof(buf))
+ die("symlink too long: %s", name);
+ prep_temp_blob(temp, buf, ret,
(one->sha1_valid ?
one->sha1 : null_sha1),
(one->sha1_valid ?