aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-01-27 14:44:07 -0800
committerJunio C Hamano <junkio@cox.net>2006-01-27 14:44:07 -0800
commit1ecc18e4fc0c91e9cab1aafbedb0eebdebaa8dd3 (patch)
tree434e41c83a51dede7fcdc822a80f4133cf59c6f8
parente921fb82cf6fb4a5f138ec9d27bc37c658336a8c (diff)
downloadgit-1ecc18e4fc0c91e9cab1aafbedb0eebdebaa8dd3.tar.gz
git-1ecc18e4fc0c91e9cab1aafbedb0eebdebaa8dd3.tar.xz
checkout: do not make a temporary copy of symlink target.
If the index records an insanely long symbolic link, copying into the temporary would overflow the buffer (noticed by Mark Wooding). Because read_sha1_file() terminates the returned buffer with NUL since late May 2005, there is no reason to copy it anymore. Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--entry.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/entry.c b/entry.c
index 410b758aa..6c47c3a3e 100644
--- a/entry.c
+++ b/entry.c
@@ -70,7 +70,6 @@ static int write_entry(struct cache_entry *ce, const char *path, struct checkout
unsigned long size;
long wrote;
char type[20];
- char target[1024];
new = read_sha1_file(ce->sha1, type, &size);
if (!new || strcmp(type, "blob")) {
@@ -94,12 +93,10 @@ static int write_entry(struct cache_entry *ce, const char *path, struct checkout
return error("git-checkout-index: unable to write file %s", path);
break;
case S_IFLNK:
- memcpy(target, new, size);
- target[size] = '\0';
- if (symlink(target, path)) {
+ if (symlink(new, path)) {
free(new);
- return error("git-checkout-index: unable to create symlink %s (%s)",
- path, strerror(errno));
+ return error("git-checkout-index: unable to create "
+ "symlink %s (%s)", path, strerror(errno));
}
free(new);
break;