selftests/landlock: Skip overlayfs tests when not supported
authorJeff Xu <jeffxu@google.com>
Fri, 13 Jan 2023 05:32:29 +0000 (05:32 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Mar 2023 08:34:09 +0000 (09:34 +0100)
commit 366617a69e60610912836570546f118006ebc7cb upstream.

overlayfs may be disabled in the kernel configuration, causing related
tests to fail.  Check that overlayfs is supported at runtime, so we can
skip layout2_overlay.* accordingly.

Signed-off-by: Jeff Xu <jeffxu@google.com>
Reviewed-by: Guenter Roeck <groeck@chromium.org>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20230113053229.1281774-2-jeffxu@google.com
[mic: Reword comments and constify variables]
Signed-off-by: Mickaël Salaün <mic@digikod.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
tools/testing/selftests/landlock/fs_test.c

index 45de42a027c549c0e3deb61197d6a6b23241467a..f2c3bffa6ea51bffe78b0b7c49dfcf49e7f1aaea 100644 (file)
@@ -11,6 +11,7 @@
 #include <fcntl.h>
 #include <linux/landlock.h>
 #include <sched.h>
+#include <stdio.h>
 #include <string.h>
 #include <sys/capability.h>
 #include <sys/mount.h>
@@ -87,6 +88,40 @@ static const char dir_s3d3[] = TMP_DIR "/s3d1/s3d2/s3d3";
  *         └── s3d3
  */
 
+static bool fgrep(FILE *const inf, const char *const str)
+{
+       char line[32];
+       const int slen = strlen(str);
+
+       while (!feof(inf)) {
+               if (!fgets(line, sizeof(line), inf))
+                       break;
+               if (strncmp(line, str, slen))
+                       continue;
+
+               return true;
+       }
+
+       return false;
+}
+
+static bool supports_overlayfs(void)
+{
+       bool res;
+       FILE *const inf = fopen("/proc/filesystems", "r");
+
+       /*
+        * Consider that the filesystem is supported if we cannot get the
+        * supported ones.
+        */
+       if (!inf)
+               return true;
+
+       res = fgrep(inf, "nodev\toverlay\n");
+       fclose(inf);
+       return res;
+}
+
 static void mkdir_parents(struct __test_metadata *const _metadata,
                          const char *const path)
 {
@@ -3539,6 +3574,9 @@ FIXTURE(layout2_overlay) {};
 
 FIXTURE_SETUP(layout2_overlay)
 {
+       if (!supports_overlayfs())
+               SKIP(return, "overlayfs is not supported");
+
        prepare_layout(_metadata);
 
        create_directory(_metadata, LOWER_BASE);
@@ -3575,6 +3613,9 @@ FIXTURE_SETUP(layout2_overlay)
 
 FIXTURE_TEARDOWN(layout2_overlay)
 {
+       if (!supports_overlayfs())
+               SKIP(return, "overlayfs is not supported");
+
        EXPECT_EQ(0, remove_path(lower_do1_fl3));
        EXPECT_EQ(0, remove_path(lower_dl1_fl2));
        EXPECT_EQ(0, remove_path(lower_fl1));
@@ -3606,6 +3647,9 @@ FIXTURE_TEARDOWN(layout2_overlay)
 
 TEST_F_FORK(layout2_overlay, no_restriction)
 {
+       if (!supports_overlayfs())
+               SKIP(return, "overlayfs is not supported");
+
        ASSERT_EQ(0, test_open(lower_fl1, O_RDONLY));
        ASSERT_EQ(0, test_open(lower_dl1, O_RDONLY));
        ASSERT_EQ(0, test_open(lower_dl1_fl2, O_RDONLY));
@@ -3769,6 +3813,9 @@ TEST_F_FORK(layout2_overlay, same_content_different_file)
        size_t i;
        const char *path_entry;
 
+       if (!supports_overlayfs())
+               SKIP(return, "overlayfs is not supported");
+
        /* Sets rules on base directories (i.e. outside overlay scope). */
        ruleset_fd = create_ruleset(_metadata, ACCESS_RW, layer1_base);
        ASSERT_LE(0, ruleset_fd);