diff options
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/test-fs-util.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/test/test-fs-util.c b/src/test/test-fs-util.c index 53a3cdc663..7c6deb5416 100644 --- a/src/test/test-fs-util.c +++ b/src/test/test-fs-util.c @@ -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); |