[PATCH v2 0/8] Directory traversal bugs
- From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Dec 10, 2019, 20:00 UTC
- Message-ID
- <pull.676.v2.git.git.1576008027.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.676.git.git.1575924465.gitgitgadget@gmail.com>
This series fixes multiple fill_directory() bugs, one of them new to 2.24.0 coming from en/clean-nested-with-ignored-topic, the rest having been around in versions of git going back up to a decade. See https://lore.kernel.org/git/87fti15agv.fsf@kyleam.com/ for the report spawning this series.
Changes since v1:
* Testcase cleanups and tweaks suggested by Denton * A tweak to this cover letter so that gitgitgadget will hopefully pick up the cc-list. (It apparently needs to be 'Cc' now, instead of 'CC')
Elijah Newren (8):
t3011: demonstrate directory traversal failures
Revert "dir.c: make 'git-status --ignored' work within leading
directories"
dir: remove stray quote character in comment
dir: exit before wildcard fall-through if there is no wildcard
dir: break part of read_directory_recursive() out for reuse
dir: fix checks on common prefix directory
dir: synchronize treat_leading_path() and read_directory_recursive()
dir: consolidate similar code in treat_directory()dir.c | 174 +++++++++++---- ...common-prefixes-and-directory-traversal.sh | 209 ++++++++++++++++++ t/t7061-wtstatus-ignore.sh | 9 +- 3 files changed, 341 insertions(+), 51 deletions(-) create mode 100755 t/t3011-common-prefixes-and-directory-traversal.sh
base-commit: da72936f544fec5a335e66432610e4cef4430991 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-676%2Fnewren%2Fls-files-bug-v2 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-676/newren/ls-files-bug-v2 Pull-Request: https://github.com/git/git/pull/676
Range-diff vs v1:
1: 4b24ba9966 ! 1: 6d659b2302 t3011: demonstrate directory traversal failures
@@ -36,8 +36,10 @@
+ git init untracked_repo &&
+ >untracked_repo/empty &&
+
-+ echo ignored >.gitignore &&
-+ echo an_ignored_dir/ >>.gitignore &&
++ cat <<-EOF >.gitignore &&
++ ignored
++ an_ignored_dir/
++ EOF
+ mkdir an_ignored_dir &&
+ mkdir an_untracked_dir &&
+ >an_ignored_dir/ignored &&
@@ -114,52 +116,60 @@
+'
+
+test_expect_failure 'git ls-files -o untracked_dir untracked_repo recurses into untracked_dir only' '
-+ echo untracked_dir/empty >expect &&
-+ echo untracked_repo/ >>expect &&
++ cat <<-EOF >expect &&
++ untracked_dir/empty
++ untracked_repo/
++ EOF
+ git ls-files -o untracked_dir untracked_repo >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'git ls-files -o untracked_dir/ untracked_repo/ recurses into untracked_dir only' '
-+ echo untracked_dir/empty >expect &&
-+ echo untracked_repo/ >>expect &&
++ cat <<-EOF >expect &&
++ untracked_dir/empty
++ untracked_repo/
++ EOF
+ git ls-files -o untracked_dir/ untracked_repo/ >actual &&
+ test_cmp expect actual
+'
+
+test_expect_failure 'git ls-files -o --directory untracked_dir untracked_repo does not recurse' '
-+ echo untracked_dir/ >expect &&
-+ echo untracked_repo/ >>expect &&
++ cat <<-EOF >expect &&
++ untracked_dir/
++ untracked_repo/
++ EOF
+ git ls-files -o --directory untracked_dir untracked_repo >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'git ls-files -o --directory untracked_dir/ untracked_repo/ does not recurse' '
-+ echo untracked_dir/ >expect &&
-+ echo untracked_repo/ >>expect &&
++ cat <<-EOF >expect &&
++ untracked_dir/
++ untracked_repo/
++ EOF
+ git ls-files -o --directory untracked_dir/ untracked_repo/ >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'git ls-files -o .git shows nothing' '
-+ >expect &&
+ git ls-files -o .git >actual &&
-+ test_cmp expect actual
++ test_must_be_empty actual
+'
+
+test_expect_failure 'git ls-files -o .git/ shows nothing' '
-+ >expect &&
+ git ls-files -o .git/ >actual &&
-+ test_cmp expect actual
++ test_must_be_empty actual
+'
+
+test_expect_success FUNNYNAMES 'git ls-files -o untracked_* recurses appropriately' '
+ mkdir "untracked_*" &&
+ >"untracked_*/empty" &&
+
-+ echo "untracked_*/empty" >expect &&
-+ echo untracked_dir/empty >>expect &&
-+ echo untracked_repo/ >>expect &&
++ cat <<-EOF >expect &&
++ untracked_*/empty
++ untracked_dir/empty
++ untracked_repo/
++ EOF
+ git ls-files -o "untracked_*" >actual &&
+ test_cmp expect actual
+'
@@ -170,25 +180,31 @@
+# must match the full path; it doesn't check it for matching a leading
+# directory.
+test_expect_failure FUNNYNAMES 'git ls-files -o untracked_*/ recurses appropriately' '
-+ echo "untracked_*/empty" >expect &&
-+ echo untracked_dir/empty >>expect &&
-+ echo untracked_repo/ >>expect &&
++ cat <<-EOF >expect &&
++ untracked_*/empty
++ untracked_dir/empty
++ untracked_repo/
++ EOF
+ git ls-files -o "untracked_*/" >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success FUNNYNAMES 'git ls-files -o --directory untracked_* does not recurse' '
-+ echo "untracked_*/" >expect &&
-+ echo untracked_dir/ >>expect &&
-+ echo untracked_repo/ >>expect &&
++ cat <<-EOF >expect &&
++ untracked_*/
++ untracked_dir/
++ untracked_repo/
++ EOF
+ git ls-files -o --directory "untracked_*" >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success FUNNYNAMES 'git ls-files -o --directory untracked_*/ does not recurse' '
-+ echo "untracked_*/" >expect &&
-+ echo untracked_dir/ >>expect &&
-+ echo untracked_repo/ >>expect &&
++ cat <<-EOF >expect &&
++ untracked_*/
++ untracked_dir/
++ untracked_repo/
++ EOF
+ git ls-files -o --directory "untracked_*/" >actual &&
+ test_cmp expect actual
+'
2: bfaf7592ee ! 2: 79f2b56174 Revert "dir.c: make 'git-status --ignored' work within leading directories"
@@ -83,7 +83,9 @@
-test_expect_success 'status prefixed untracked directory with --ignored' '
+test_expect_failure 'status of untracked directory with --ignored works with or without prefix' '
-+ git status --porcelain --ignored | grep untracked/ >actual &&
++ git status --porcelain --ignored >tmp &&
++ grep untracked/ tmp >actual &&
++ rm tmp &&
+ test_cmp expected actual &&
+
git status --porcelain --ignored untracked/ >actual &&
3: ea2588e87c = 3: d6f858cab1 dir: remove stray quote character in comment
4: c3220758ab ! 4: 8d2d98eec3 dir: exit before wildcard fall-through if there is no wildcard
@@ -37,15 +37,15 @@
-test_expect_failure 'git ls-files -o untracked_dir untracked_repo recurses into untracked_dir only' '
+test_expect_success 'git ls-files -o untracked_dir untracked_repo recurses into untracked_dir only' '
- echo untracked_dir/empty >expect &&
- echo untracked_repo/ >>expect &&
- git ls-files -o untracked_dir untracked_repo >actual &&
+ cat <<-EOF >expect &&
+ untracked_dir/empty
+ untracked_repo/
@@
test_cmp expect actual
'
-test_expect_failure 'git ls-files -o --directory untracked_dir untracked_repo does not recurse' '
+test_expect_success 'git ls-files -o --directory untracked_dir untracked_repo does not recurse' '
- echo untracked_dir/ >expect &&
- echo untracked_repo/ >>expect &&
- git ls-files -o --directory untracked_dir untracked_repo >actual &&
+ cat <<-EOF >expect &&
+ untracked_dir/
+ untracked_repo/
5: 738d9ae4c9 = 5: d2f5623bd7 dir: break part of read_directory_recursive() out for reuse
6: b897095136 ! 6: 9839aca00a dir: fix checks on common prefix directory
@@ -164,11 +164,11 @@
git ls-files -o untracked_repo/ >actual &&
test_cmp expect actual
@@
- test_cmp expect actual
+ test_must_be_empty actual
'
-test_expect_failure 'git ls-files -o .git/ shows nothing' '
+test_expect_success 'git ls-files -o .git/ shows nothing' '
- >expect &&
git ls-files -o .git/ >actual &&
- test_cmp expect actual
+ test_must_be_empty actual
+ '
7: 4f8bf05d26 ! 7: df7f08886a dir: synchronize treat_leading_path() and read_directory_recursive()
@@ -104,6 +104,6 @@
-test_expect_failure 'status of untracked directory with --ignored works with or without prefix' '
+test_expect_success 'status of untracked directory with --ignored works with or without prefix' '
- git status --porcelain --ignored | grep untracked/ >actual &&
- test_cmp expected actual &&
-
+ git status --porcelain --ignored >tmp &&
+ grep untracked/ tmp >actual &&
+ rm tmp &&
8: 2200bf144a = 8: 77b57e44fd dir: consolidate similar code in treat_directory()-- gitgitgadget