[PATCH] prefix_path(): disallow absolute paths
From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:44:08
Subsystem:
the rest · Maintainer:
Linus Torvalds
Without this fix, "git ls-files --others /" would list _all_ files, except for those tracked in the current repository. Worse, "git clean /" would start removing them. Noticed by Johannes Sixt. Incidentally, it fixes some strange code in builtin-mv.c by yours truly, where a slash was added to "dst" but then ignored, and instead taken from the source path. This triggered the new check for absolute paths. A test in t3101 started failing, too, because it tested ls-tree with not-really-absolute paths (expecting the leading "/" to be ignored). Those paths were changed to relative paths. Signed-off-by: Johannes Schindelin <redacted> --- On Mon, 28 Jan 2008, Johannes Schindelin wrote: > The failure of t3101 has something to do with ls-tree filtering > out invalid paths; I maintain that this behaviour is wrong to > begin with. This patch fixes the test. But as this fix illustrates, it is a change in semantics: where earlier git ls-tree /README was allowed, it is no longer. Comments? builtin-mv.c | 4 ++-- setup.c | 2 ++ t/t3101-ls-tree-dirname.sh | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/builtin-mv.c b/builtin-mv.c
index 990e213..94f6dd2 100644
--- a/builtin-mv.c
+++ b/builtin-mv.c@@ -164,7 +164,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix) } dst = add_slash(dst); - dst_len = strlen(dst) - 1; + dst_len = strlen(dst); for (j = 0; j < last - first; j++) { const char *path =
@@ -172,7 +172,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix) source[argc + j] = path; destination[argc + j] = prefix_path(dst, dst_len, - path + length); + path + length + 1); modes[argc + j] = INDEX; } argc += last - first;
diff --git a/setup.c b/setup.c
index 2174e78..5a4aadc 100644
--- a/setup.c
+++ b/setup.c@@ -13,6 +13,8 @@ const char *get_current_prefix() const char *prefix_path(const char *prefix, int len, const char *path) { const char *orig = path; + if (is_absolute_path(path)) + die("no absolute paths allowed: '%s'", path); for (;;) { char c; if (*path != '.')
diff --git a/t/t3101-ls-tree-dirname.sh b/t/t3101-ls-tree-dirname.sh
index 39fe267..cc5b982 100755
--- a/t/t3101-ls-tree-dirname.sh
+++ b/t/t3101-ls-tree-dirname.sh@@ -120,7 +120,7 @@ EOF # having 1.txt and path3 test_expect_success \ 'ls-tree filter odd names' \ - 'git ls-tree $tree 1.txt /1.txt //1.txt path3/1.txt /path3/1.txt //path3//1.txt path3 /path3/ path3// >current && + 'git ls-tree $tree 1.txt ./1.txt .//1.txt path3/1.txt ./path3/1.txt .//path3//1.txt path3 ./path3/ path3// >current && cat >expected <<\EOF && 100644 blob X 1.txt 100644 blob X path3/1.txt
--
1.5.4.rc5.15.g8231f