mirror of https://github.com/torvalds/linux.git
selftests/namespaces: sixth inactive namespace resurrection test
Test multiple sockets keep the same network namespace active. Create multiple sockets, verify closing some doesn't affect others. Link: https://patch.msgid.link/20251029-work-namespace-nstree-listns-v4-60-2e6f823ebdc0@kernel.org Tested-by: syzbot@syzkaller.appspotmail.com Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
2b9fa5bf0c
commit
aec2237695
|
|
@ -333,4 +333,72 @@ TEST(siocgskns_non_socket)
|
|||
close(pipefd[1]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Test multiple sockets keep the same network namespace active.
|
||||
* Create multiple sockets, verify closing some doesn't affect others.
|
||||
*/
|
||||
TEST(siocgskns_multiple_sockets)
|
||||
{
|
||||
int socks[5];
|
||||
int netns_fds[5];
|
||||
int i;
|
||||
struct stat st;
|
||||
ino_t netns_ino;
|
||||
|
||||
/* Create new network namespace */
|
||||
ASSERT_EQ(unshare(CLONE_NEWNET), 0);
|
||||
|
||||
/* Create multiple sockets */
|
||||
for (i = 0; i < 5; i++) {
|
||||
socks[i] = socket(AF_INET, SOCK_STREAM, 0);
|
||||
ASSERT_GE(socks[i], 0);
|
||||
}
|
||||
|
||||
/* Get netns from all sockets */
|
||||
for (i = 0; i < 5; i++) {
|
||||
netns_fds[i] = ioctl(socks[i], SIOCGSKNS);
|
||||
if (netns_fds[i] < 0) {
|
||||
int j;
|
||||
for (j = 0; j <= i; j++) {
|
||||
close(socks[j]);
|
||||
if (j < i && netns_fds[j] >= 0)
|
||||
close(netns_fds[j]);
|
||||
}
|
||||
if (errno == ENOTTY || errno == EINVAL)
|
||||
SKIP(return, "SIOCGSKNS not supported");
|
||||
ASSERT_GE(netns_fds[i], 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Verify all point to same netns */
|
||||
ASSERT_EQ(fstat(netns_fds[0], &st), 0);
|
||||
netns_ino = st.st_ino;
|
||||
|
||||
for (i = 1; i < 5; i++) {
|
||||
ASSERT_EQ(fstat(netns_fds[i], &st), 0);
|
||||
ASSERT_EQ(st.st_ino, netns_ino);
|
||||
}
|
||||
|
||||
/* Close some sockets */
|
||||
for (i = 0; i < 3; i++) {
|
||||
close(socks[i]);
|
||||
}
|
||||
|
||||
/* Remaining netns FDs should still be valid */
|
||||
for (i = 3; i < 5; i++) {
|
||||
char path[64];
|
||||
snprintf(path, sizeof(path), "/proc/self/fd/%d", netns_fds[i]);
|
||||
int test_fd = open(path, O_RDONLY);
|
||||
ASSERT_GE(test_fd, 0);
|
||||
close(test_fd);
|
||||
}
|
||||
|
||||
/* Cleanup */
|
||||
for (i = 0; i < 5; i++) {
|
||||
if (i >= 3)
|
||||
close(socks[i]);
|
||||
close(netns_fds[i]);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_HARNESS_MAIN
|
||||
|
|
|
|||
Loading…
Reference in New Issue