Commits

Anonymous committed 2c71810

git-apply: applying a patch to make a symlink shorter.

The internal representation of the result is counted string
(i.e. char *buf and ulong size), which is fine for writing out
to regular file, but throwing the buf at symlink(2) was a
no-no.

Reported by Willy Tarreau.

Signed-off-by: Junio C Hamano <junkio@cox.net>

  • Participants
  • Parent commits 943d5b7

Comments (0)

Files changed (2)

 	desc.buffer = buf;
 	if (apply_fragments(&desc, patch) < 0)
 		return -1;
+
+	/* NUL terminate the result */
+	if (desc.alloc <= desc.size) {
+		desc.buffer = xrealloc(desc.buffer, desc.size + 1);
+		desc.alloc++;
+	}
+	desc.buffer[desc.size] = 0;
+
 	patch->result = desc.buffer;
 	patch->resultsize = desc.size;
 
 	int fd;
 
 	if (S_ISLNK(mode))
+		/* Although buf:size is counted string, it also is NUL
+		 * terminated.
+		 */
 		return symlink(buf, path);
 	fd = open(path, O_CREAT | O_EXCL | O_WRONLY, (mode & 0100) ? 0777 : 0666);
 	if (fd < 0)

t/t4115-apply-symlink.sh

+#!/bin/sh
+#
+# Copyright (c) 2005 Junio C Hamano
+#
+
+test_description='git-apply symlinks and partial files
+
+'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+
+	ln -s path1/path2/path3/path4/path5 link1 &&
+	git add link? &&
+	git commit -m initial &&
+
+	git branch side &&
+
+	rm -f link? &&
+
+	ln -s htap6 link1 &&
+	git update-index link? &&
+	git commit -m second &&
+
+	git diff-tree -p HEAD^ HEAD >patch  &&
+	git apply --stat --summary patch
+
+'
+
+test_expect_success 'apply symlink patch' '
+
+	git checkout side &&
+	git apply patch &&
+	git diff-files -p >patched &&
+	diff -u patch patched
+
+'
+
+test_expect_success 'apply --index symlink patch' '
+
+	git checkout -f side &&
+	git apply --index patch &&
+	git diff-index --cached -p HEAD >patched &&
+	diff -u patch patched
+
+'
+
+test_done