]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/namespaces: second listns() test
authorChristian Brauner <brauner@kernel.org>
Wed, 29 Oct 2025 12:20:53 +0000 (13:20 +0100)
committerChristian Brauner <brauner@kernel.org>
Mon, 3 Nov 2025 16:41:21 +0000 (17:41 +0100)
test listns() with type filtering.
List only network namespaces.

Link: https://patch.msgid.link/20251029-work-namespace-nstree-listns-v4-40-2e6f823ebdc0@kernel.org
Tested-by: syzbot@syzkaller.appspotmail.com
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
tools/testing/selftests/namespaces/listns_test.c

index cb42827d3dfe2d6c94b023370bf308997f2da5c9..64249502ac499fbe84ccc0020bef3b907f62611c 100644 (file)
@@ -54,4 +54,65 @@ TEST(listns_basic_unified)
        }
 }
 
+/*
+ * Test listns() with type filtering.
+ * List only network namespaces.
+ */
+TEST(listns_filter_by_type)
+{
+       struct ns_id_req req = {
+               .size = sizeof(req),
+               .spare = 0,
+               .ns_id = 0,
+               .ns_type = CLONE_NEWNET,  /* Only network namespaces */
+               .spare2 = 0,
+               .user_ns_id = 0,
+       };
+       __u64 ns_ids[100];
+       ssize_t ret;
+
+       ret = sys_listns(&req, ns_ids, ARRAY_SIZE(ns_ids), 0);
+       if (ret < 0) {
+               if (errno == ENOSYS)
+                       SKIP(return, "listns() not supported");
+               TH_LOG("listns failed: %s (errno=%d)", strerror(errno), errno);
+               ASSERT_TRUE(false);
+       }
+       ASSERT_GE(ret, 0);
+
+       /* Should find at least init_net */
+       ASSERT_GT(ret, 0);
+       TH_LOG("Found %zd active network namespaces", ret);
+
+       /* Verify we can open each namespace and it's actually a network namespace */
+       for (ssize_t i = 0; i < ret && i < 5; i++) {
+               struct nsfs_file_handle nsfh = {
+                       .ns_id = ns_ids[i],
+                       .ns_type = CLONE_NEWNET,
+                       .ns_inum = 0,
+               };
+               struct file_handle *fh;
+               int fd;
+
+               fh = (struct file_handle *)malloc(sizeof(*fh) + sizeof(nsfh));
+               ASSERT_NE(fh, NULL);
+               fh->handle_bytes = sizeof(nsfh);
+               fh->handle_type = 0;
+               memcpy(fh->f_handle, &nsfh, sizeof(nsfh));
+
+               fd = open_by_handle_at(-10003, fh, O_RDONLY);
+               free(fh);
+
+               if (fd >= 0) {
+                       int ns_type;
+                       /* Verify it's a network namespace via ioctl */
+                       ns_type = ioctl(fd, NS_GET_NSTYPE);
+                       if (ns_type >= 0) {
+                               ASSERT_EQ(ns_type, CLONE_NEWNET);
+                       }
+                       close(fd);
+               }
+       }
+}
+
 TEST_HARNESS_MAIN