]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/namespaces: fourth inactive namespace resurrection test
authorChristian Brauner <brauner@kernel.org>
Wed, 29 Oct 2025 12:21:11 +0000 (13:21 +0100)
committerChristian Brauner <brauner@kernel.org>
Mon, 3 Nov 2025 16:41:23 +0000 (17:41 +0100)
Test SIOCGSKNS across setns. Create a socket in netns A, switch to netns
B, verify SIOCGSKNS still returns netns A.

Link: https://patch.msgid.link/20251029-work-namespace-nstree-listns-v4-58-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/siocgskns_test.c

index 02798e59fc11a22a39d74ec476719aeb0fac10f2..28e45954c4fac764f06ba96d7be4e8bf83111371 100644 (file)
@@ -256,4 +256,55 @@ TEST(siocgskns_socket_types)
        close(sock_udp);
 }
 
+/*
+ * Test SIOCGSKNS across setns.
+ * Create a socket in netns A, switch to netns B, verify SIOCGSKNS still
+ * returns netns A.
+ */
+TEST(siocgskns_across_setns)
+{
+       int sock_fd, netns_a_fd, netns_b_fd, result_fd;
+       struct stat st_a;
+
+       /* Get current netns (A) */
+       netns_a_fd = open("/proc/self/ns/net", O_RDONLY);
+       ASSERT_GE(netns_a_fd, 0);
+       ASSERT_EQ(fstat(netns_a_fd, &st_a), 0);
+
+       /* Create socket in netns A */
+       sock_fd = socket(AF_INET, SOCK_STREAM, 0);
+       ASSERT_GE(sock_fd, 0);
+
+       /* Create new netns (B) */
+       ASSERT_EQ(unshare(CLONE_NEWNET), 0);
+
+       netns_b_fd = open("/proc/self/ns/net", O_RDONLY);
+       ASSERT_GE(netns_b_fd, 0);
+
+       /* Get netns from socket created in A */
+       result_fd = ioctl(sock_fd, SIOCGSKNS);
+       if (result_fd < 0) {
+               close(sock_fd);
+               setns(netns_a_fd, CLONE_NEWNET);
+               close(netns_a_fd);
+               close(netns_b_fd);
+               if (errno == ENOTTY || errno == EINVAL)
+                       SKIP(return, "SIOCGSKNS not supported");
+               ASSERT_GE(result_fd, 0);
+       }
+
+       /* Verify it still points to netns A */
+       struct stat st_result_stat;
+       ASSERT_EQ(fstat(result_fd, &st_result_stat), 0);
+       ASSERT_EQ(st_a.st_ino, st_result_stat.st_ino);
+
+       close(result_fd);
+       close(sock_fd);
+       close(netns_b_fd);
+
+       /* Restore original netns */
+       ASSERT_EQ(setns(netns_a_fd, CLONE_NEWNET), 0);
+       close(netns_a_fd);
+}
+
 TEST_HARNESS_MAIN