Browse Source

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>
maint
Junio C Hamano 19 years ago
parent
commit
2c71810b90
  1. 11
      builtin-apply.c
  2. 49
      t/t4115-apply-symlink.sh

11
builtin-apply.c

@ -1698,6 +1698,14 @@ static int apply_data(struct patch *patch, struct stat *st, struct cache_entry * @@ -1698,6 +1698,14 @@ static int apply_data(struct patch *patch, struct stat *st, struct cache_entry *
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;

@ -2040,6 +2048,9 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf, @@ -2040,6 +2048,9 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
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)

49
t/t4115-apply-symlink.sh

@ -0,0 +1,49 @@ @@ -0,0 +1,49 @@
#!/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
Loading…
Cancel
Save