diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-12-17 22:28:03 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-12-17 22:28:03 -0800 |
commit | c0ceb2c32d40c4bc835597105ba0c0fac4ae36ba (patch) | |
tree | 628e9b1a593ddd50ed1f33754d654aae3e30630b /diff.c | |
parent | 954597bd198f31e66ac39bea60cfdb8d1ced858c (diff) | |
parent | 912342d9d69a30e49491f3fd4d3aa8dc2f6050f3 (diff) | |
download | git-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.c | 25 |
1 files changed, 11 insertions, 14 deletions
@@ -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 ? |