checkout tests: nasty symlinks Symbolic links that abuse case insensitivity to write into .git.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
diff --git a/tests/checkout/nasty.c b/tests/checkout/nasty.c
index c07d938..bc25a3b 100644
--- a/tests/checkout/nasty.c
+++ b/tests/checkout/nasty.c
@@ -23,7 +23,29 @@ void test_checkout_nasty__cleanup(void)
cl_git_sandbox_cleanup();
}
-void test_checkout_fails(const char *refname, const char *filename)
+static void test_checkout_passes(const char *refname, const char *filename)
+{
+ git_oid commit_id;
+ git_commit *commit;
+ git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
+ git_buf path = GIT_BUF_INIT;
+
+ cl_git_pass(git_buf_joinpath(&path, repo_name, filename));
+
+ cl_git_pass(git_reference_name_to_id(&commit_id, repo, refname));
+ cl_git_pass(git_commit_lookup(&commit, repo, &commit_id));
+
+ opts.checkout_strategy = GIT_CHECKOUT_FORCE |
+ GIT_CHECKOUT_DONT_UPDATE_INDEX;
+
+ cl_git_pass(git_checkout_tree(repo, (const git_object *)commit, &opts));
+ cl_assert(!git_path_exists(path.ptr));
+
+ git_commit_free(commit);
+ git_buf_free(&path);
+}
+
+static void test_checkout_fails(const char *refname, const char *filename)
{
git_oid commit_id;
git_commit *commit;
@@ -323,3 +345,19 @@ void test_checkout_nasty__honors_core_protectntfs(void)
test_checkout_fails("refs/heads/dot_git_dot", ".git/foobar");
test_checkout_fails("refs/heads/git_tilde1", ".git/foobar");
}
+
+void test_checkout_nasty__symlink1(void)
+{
+ test_checkout_passes("refs/heads/symlink1", ".git/foobar");
+}
+
+void test_checkout_nasty__symlink2(void)
+{
+ test_checkout_passes("refs/heads/symlink2", ".git/foobar");
+}
+
+void test_checkout_nasty__symlink3(void)
+{
+ test_checkout_passes("refs/heads/symlink3", ".git/foobar");
+}
+
diff --git a/tests/resources/nasty/.gitted/objects/14/e70ab559b4c6a8a6fc9b6f538bd1f3934be725 b/tests/resources/nasty/.gitted/objects/14/e70ab559b4c6a8a6fc9b6f538bd1f3934be725
new file mode 100644
index 0000000..371951a
Binary files /dev/null and b/tests/resources/nasty/.gitted/objects/14/e70ab559b4c6a8a6fc9b6f538bd1f3934be725 differ
diff --git a/tests/resources/nasty/.gitted/objects/19/1381ee74dec49c89f99a62d055cb1058ba0de9 b/tests/resources/nasty/.gitted/objects/19/1381ee74dec49c89f99a62d055cb1058ba0de9
new file mode 100644
index 0000000..f1619a2
Binary files /dev/null and b/tests/resources/nasty/.gitted/objects/19/1381ee74dec49c89f99a62d055cb1058ba0de9 differ
diff --git a/tests/resources/nasty/.gitted/objects/1b/31d55e0c53efbea6c670ece9057b76b5822eea b/tests/resources/nasty/.gitted/objects/1b/31d55e0c53efbea6c670ece9057b76b5822eea
deleted file mode 100644
index 20ede1b..0000000
--- a/tests/resources/nasty/.gitted/objects/1b/31d55e0c53efbea6c670ece9057b76b5822eea
+++ /dev/null
@@ -1,2 +0,0 @@
-xa
-!)Z|t"O'>1}ݠ5
̄Zʭî7ffV)JC9Y%URN~fcgsmp/"\s-k}/M q쥖R:;9#.wmz@
\ No newline at end of file
diff --git a/tests/resources/nasty/.gitted/objects/4d/83272d0d372e1232ddc4ff3260d76fdfa2015a b/tests/resources/nasty/.gitted/objects/4d/83272d0d372e1232ddc4ff3260d76fdfa2015a
new file mode 100644
index 0000000..d362f1d
--- /dev/null
+++ b/tests/resources/nasty/.gitted/objects/4d/83272d0d372e1232ddc4ff3260d76fdfa2015a
@@ -0,0 +1,2 @@
+xK
+1D]}Dx/ONH"2wo=5e@}L<%AD̄VI:%IrIDPs̵-|KpkvIW_;Ś/@-WGTl?gX}lзDX`oԙD
\ No newline at end of file
diff --git a/tests/resources/nasty/.gitted/objects/7b/b1dd08b2c7d73084934954e4196e67004b0279 b/tests/resources/nasty/.gitted/objects/7b/b1dd08b2c7d73084934954e4196e67004b0279
new file mode 100644
index 0000000..e6640e6
Binary files /dev/null and b/tests/resources/nasty/.gitted/objects/7b/b1dd08b2c7d73084934954e4196e67004b0279 differ
diff --git a/tests/resources/nasty/.gitted/objects/91/cd2c95af92883550b45fcc838013ae7e2954df b/tests/resources/nasty/.gitted/objects/91/cd2c95af92883550b45fcc838013ae7e2954df
new file mode 100644
index 0000000..da9d5c4
Binary files /dev/null and b/tests/resources/nasty/.gitted/objects/91/cd2c95af92883550b45fcc838013ae7e2954df differ
diff --git a/tests/resources/nasty/.gitted/objects/9d/5898503adc01d763e279ac8fcefbe865b19031 b/tests/resources/nasty/.gitted/objects/9d/5898503adc01d763e279ac8fcefbe865b19031
new file mode 100644
index 0000000..7cb3106
--- /dev/null
+++ b/tests/resources/nasty/.gitted/objects/9d/5898503adc01d763e279ac8fcefbe865b19031
@@ -0,0 +1,4 @@
+xO[ S4R
+Icz
+۴t
bK7k^L&pJS%qS2T=51vo45tzuQFpO#\FNw^HvVQTFߩy
+0Ouy$>F
\ No newline at end of file
diff --git a/tests/resources/nasty/.gitted/objects/a0/d89aa95628fcd6b64fd5b23dd56b906b06bfe2 b/tests/resources/nasty/.gitted/objects/a0/d89aa95628fcd6b64fd5b23dd56b906b06bfe2
new file mode 100644
index 0000000..c1de43b
Binary files /dev/null and b/tests/resources/nasty/.gitted/objects/a0/d89aa95628fcd6b64fd5b23dd56b906b06bfe2 differ
diff --git a/tests/resources/nasty/.gitted/objects/a7/8dde970cffbb71d67bef2a74aa72c6621d9819 b/tests/resources/nasty/.gitted/objects/a7/8dde970cffbb71d67bef2a74aa72c6621d9819
new file mode 100644
index 0000000..78c2fe4
Binary files /dev/null and b/tests/resources/nasty/.gitted/objects/a7/8dde970cffbb71d67bef2a74aa72c6621d9819 differ
diff --git a/tests/resources/nasty/.gitted/objects/ac/84d85a425b2a21fd0ffccacac6c48823fc98c8 b/tests/resources/nasty/.gitted/objects/ac/84d85a425b2a21fd0ffccacac6c48823fc98c8
new file mode 100644
index 0000000..b08e247
Binary files /dev/null and b/tests/resources/nasty/.gitted/objects/ac/84d85a425b2a21fd0ffccacac6c48823fc98c8 differ
diff --git a/tests/resources/nasty/.gitted/objects/bc/e2dabe5766838216d95f199d95aa4fd479a084 b/tests/resources/nasty/.gitted/objects/bc/e2dabe5766838216d95f199d95aa4fd479a084
new file mode 100644
index 0000000..b1eab10
Binary files /dev/null and b/tests/resources/nasty/.gitted/objects/bc/e2dabe5766838216d95f199d95aa4fd479a084 differ
diff --git a/tests/resources/nasty/.gitted/objects/cf/6fcf8cdf7e8d4cda3b11b0ba02d0d5125fbbd7 b/tests/resources/nasty/.gitted/objects/cf/6fcf8cdf7e8d4cda3b11b0ba02d0d5125fbbd7
new file mode 100644
index 0000000..f65e8ff
--- /dev/null
+++ b/tests/resources/nasty/.gitted/objects/cf/6fcf8cdf7e8d4cda3b11b0ba02d0d5125fbbd7
@@ -0,0 +1,2 @@
+x]
+0})Jm `ӕQooo70x9@%7e%kh0QAGi5F^
+î/0Ruos;yEöBֈ+;9-uoG
\ No newline at end of file
diff --git a/tests/resources/nasty/.gitted/objects/e5/1c3fa44fe981ec290c8f47fea736f3ff2af2a6 b/tests/resources/nasty/.gitted/objects/e5/1c3fa44fe981ec290c8f47fea736f3ff2af2a6
new file mode 100644
index 0000000..3d12f3a
Binary files /dev/null and b/tests/resources/nasty/.gitted/objects/e5/1c3fa44fe981ec290c8f47fea736f3ff2af2a6 differ
diff --git a/tests/resources/nasty/.gitted/objects/e8/68b1d6833710021785581a9e11dba8468f3a55 b/tests/resources/nasty/.gitted/objects/e8/68b1d6833710021785581a9e11dba8468f3a55
new file mode 100644
index 0000000..8311ad3
Binary files /dev/null and b/tests/resources/nasty/.gitted/objects/e8/68b1d6833710021785581a9e11dba8468f3a55 differ
diff --git a/tests/resources/nasty/.gitted/refs/heads/symlink1 b/tests/resources/nasty/.gitted/refs/heads/symlink1
new file mode 100644
index 0000000..efa2e88
--- /dev/null
+++ b/tests/resources/nasty/.gitted/refs/heads/symlink1
@@ -0,0 +1 @@
+4d83272d0d372e1232ddc4ff3260d76fdfa2015a
diff --git a/tests/resources/nasty/.gitted/refs/heads/symlink2 b/tests/resources/nasty/.gitted/refs/heads/symlink2
new file mode 100644
index 0000000..e4f3d60
--- /dev/null
+++ b/tests/resources/nasty/.gitted/refs/heads/symlink2
@@ -0,0 +1 @@
+9d5898503adc01d763e279ac8fcefbe865b19031
diff --git a/tests/resources/nasty/.gitted/refs/heads/symlink3 b/tests/resources/nasty/.gitted/refs/heads/symlink3
new file mode 100644
index 0000000..2b33e4f
--- /dev/null
+++ b/tests/resources/nasty/.gitted/refs/heads/symlink3
@@ -0,0 +1 @@
+cf6fcf8cdf7e8d4cda3b11b0ba02d0d5125fbbd7