]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-fs-util: add a test case with repeated ".." parts that would escape the root
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sun, 27 Nov 2016 03:18:58 +0000 (22:18 -0500)
committerLennart Poettering <lennart@poettering.net>
Wed, 30 Nov 2016 23:25:51 +0000 (00:25 +0100)
src/test/test-fs-util.c

index 53a3cdc6635704301cf885f147a56a2eb334d535..7c6deb5416871feac267b06d542c6f54a13d48dc 100644 (file)
@@ -60,6 +60,8 @@ static void test_chase_symlinks(void) {
         p = strjoina(temp, "/start");
         assert_se(symlink("top/dot/dotdota", p) >= 0);
 
+        /* Paths that use symlinks underneath the "root" */
+
         r = chase_symlinks(p, NULL, &result);
         assert_se(r >= 0);
         assert_se(path_equal(result, "/usr"));
@@ -88,6 +90,31 @@ static void test_chase_symlinks(void) {
         assert_se(r >= 0);
         assert_se(path_equal(result, temp));
 
+        /* Paths that would "escape" outside of the "root" */
+
+        p = strjoina(temp, "/6dots");
+        assert_se(symlink("../../..", p) >= 0);
+
+        result = mfree(result);
+        r = chase_symlinks(p, temp, &result);
+        assert_se(r == -EINVAL);
+
+        p = strjoina(temp, "/6dotsusr");
+        assert_se(symlink("../../../usr", p) >= 0);
+
+        result = mfree(result);
+        r = chase_symlinks(p, temp, &result);
+        assert_se(r == -EINVAL);
+
+        p = strjoina(temp, "/top/8dotsusr");
+        assert_se(symlink("../../../../usr", p) >= 0);
+
+        result = mfree(result);
+        r = chase_symlinks(p, temp, &result);
+        assert_se(r == -EINVAL);
+
+        /* Paths that contain repeated slashes */
+
         p = strjoina(temp, "/slashslash");
         assert_se(symlink("///usr///", p) >= 0);
 
@@ -101,6 +128,8 @@ static void test_chase_symlinks(void) {
         assert_se(r >= 0);
         assert_se(path_equal(result, q));
 
+        /* Paths using . */
+
         result = mfree(result);
         r = chase_symlinks("/etc/./.././", NULL, &result);
         assert_se(r >= 0);
@@ -114,6 +143,8 @@ static void test_chase_symlinks(void) {
         r = chase_symlinks("/etc/machine-id/foo", NULL, &result);
         assert_se(r == -ENOTDIR);
 
+        /* Path that loops back to self */
+
         result = mfree(result);
         p = strjoina(temp, "/recursive-symlink");
         assert_se(symlink("recursive-symlink", p) >= 0);