diff options
author | Lennart Poettering <lennart@poettering.net> | 2020-12-17 16:19:09 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2020-12-17 19:29:24 +0100 |
commit | 95231c7215c3ff14c491eb1d2a93312a8fe0c4f6 (patch) | |
tree | 3313cf2b437bc9f3e9c3fc509c372ffe59bc73ae /src/test | |
parent | 8b08be4052fa51a9ad0de8a6f9213efe4dac213d (diff) | |
download | systemd-95231c7215c3ff14c491eb1d2a93312a8fe0c4f6.tar.gz |
test: fix fd_is_mount_point() check
So the currentl and only fd_is_mount_point() check is actually entirely
bogus: it passes "/" as filename argument, but that's not actually a
a valid filename, but an absolute path.
fd_is_mount_point() is written in a way tha the fd refers to a directory
and the specified path is a file directly below it that shall be
checked. The test call actually violated that rule, but still expected
success.
Let's fix this, and check for this explicitly, and refuse it.
Let's extend the test and move it to test-mountpoint-util.c where the
rest of the tests for related calls are placed.
Replaces: #18004
Fixes: #17950
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/test-mountpoint-util.c | 32 | ||||
-rw-r--r-- | src/test/test-path-util.c | 7 |
2 files changed, 32 insertions, 7 deletions
diff --git a/src/test/test-mountpoint-util.c b/src/test/test-mountpoint-util.c index 287488b7c1..47fde5cb2c 100644 --- a/src/test/test-mountpoint-util.c +++ b/src/test/test-mountpoint-util.c @@ -256,6 +256,37 @@ static void test_path_is_mount_point(void) { assert_se(rm_rf(tmp_dir, REMOVE_ROOT|REMOVE_PHYSICAL) == 0); } +static void test_fd_is_mount_point(void) { + _cleanup_close_ int fd = -1; + + log_info("/* %s */", __func__); + + fd = open("/", O_RDONLY|O_CLOEXEC|O_DIRECTORY|O_NOCTTY); + assert_se(fd >= 0); + + /* Not allowed, since "/" is a path, not a plain filename */ + assert_se(fd_is_mount_point(fd, "/", 0) == -EINVAL); + assert_se(fd_is_mount_point(fd, ".", 0) == -EINVAL); + assert_se(fd_is_mount_point(fd, "./", 0) == -EINVAL); + assert_se(fd_is_mount_point(fd, "..", 0) == -EINVAL); + assert_se(fd_is_mount_point(fd, "../", 0) == -EINVAL); + assert_se(fd_is_mount_point(fd, "", 0) == -EINVAL); + assert_se(fd_is_mount_point(fd, "/proc", 0) == -EINVAL); + assert_se(fd_is_mount_point(fd, "/proc/", 0) == -EINVAL); + assert_se(fd_is_mount_point(fd, "proc/sys", 0) == -EINVAL); + assert_se(fd_is_mount_point(fd, "proc/sys/", 0) == -EINVAL); + + /* This one definitely is a mount point */ + assert_se(fd_is_mount_point(fd, "proc", 0) > 0); + assert_se(fd_is_mount_point(fd, "proc/", 0) > 0); + + /* /root's entire raison d'etre is to be on the root file system (i.e. not in /home/ which might be + * split off), so that the user can always log in, so it cannot be a mount point unless the system is + * borked. Let's allow for it to be missing though. */ + assert_se(IN_SET(fd_is_mount_point(fd, "root", 0), -ENOENT, 0)); + assert_se(IN_SET(fd_is_mount_point(fd, "root/", 0), -ENOENT, 0)); +} + int main(int argc, char *argv[]) { test_setup_logging(LOG_DEBUG); @@ -279,6 +310,7 @@ int main(int argc, char *argv[]) { test_mnt_id(); test_path_is_mount_point(); + test_fd_is_mount_point(); return 0; } diff --git a/src/test/test-path-util.c b/src/test/test-path-util.c index 874bab8f94..fcaffa4539 100644 --- a/src/test/test-path-util.c +++ b/src/test/test-path-util.c @@ -7,7 +7,6 @@ #include "exec-util.h" #include "fd-util.h" #include "macro.h" -#include "mountpoint-util.h" #include "path-util.h" #include "process-util.h" #include "rm-rf.h" @@ -42,8 +41,6 @@ static void test_path_simplify(const char *in, const char *out, const char *out_ } static void test_path(void) { - _cleanup_close_ int fd = -1; - log_info("/* %s */", __func__); test_path_compare("/goo", "/goo", 0); @@ -82,10 +79,6 @@ static void test_path(void) { assert_se(streq(basename("/aa///file..."), "file...")); assert_se(streq(basename("file.../"), "")); - fd = open("/", O_RDONLY|O_CLOEXEC|O_DIRECTORY|O_NOCTTY); - assert_se(fd >= 0); - assert_se(fd_is_mount_point(fd, "/", 0) > 0); - test_path_simplify("aaa/bbb////ccc", "aaa/bbb/ccc", "aaa/bbb/ccc"); test_path_simplify("//aaa/.////ccc", "/aaa/./ccc", "/aaa/ccc"); test_path_simplify("///", "/", "/"); |