Skip to content

Commit 6453937

Browse files
committed
selftests/namespaces: fix nsid tests
Ensure that we always kill and cleanup all processes. Link: https://patch.msgid.link/20251110-work-namespace-nstree-fixes-v1-17-e8a9264e0fb9@kernel.org Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent c2bbd2d commit 6453937

1 file changed

Lines changed: 51 additions & 56 deletions

File tree

tools/testing/selftests/namespaces/nsid_test.c

Lines changed: 51 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <libgen.h>
77
#include <limits.h>
88
#include <pthread.h>
9+
#include <signal.h>
910
#include <string.h>
1011
#include <sys/mount.h>
1112
#include <poll.h>
@@ -14,12 +15,30 @@
1415
#include <sys/stat.h>
1516
#include <sys/socket.h>
1617
#include <sys/un.h>
18+
#include <sys/wait.h>
1719
#include <unistd.h>
1820
#include <linux/fs.h>
1921
#include <linux/limits.h>
2022
#include <linux/nsfs.h>
2123
#include "../kselftest_harness.h"
2224

25+
/* Fixture for tests that create child processes */
26+
FIXTURE(nsid) {
27+
pid_t child_pid;
28+
};
29+
30+
FIXTURE_SETUP(nsid) {
31+
self->child_pid = 0;
32+
}
33+
34+
FIXTURE_TEARDOWN(nsid) {
35+
/* Clean up any child process that may still be running */
36+
if (self->child_pid > 0) {
37+
kill(self->child_pid, SIGKILL);
38+
waitpid(self->child_pid, NULL, 0);
39+
}
40+
}
41+
2342
TEST(nsid_mntns_basic)
2443
{
2544
__u64 mnt_ns_id = 0;
@@ -44,7 +63,7 @@ TEST(nsid_mntns_basic)
4463
close(fd_mntns);
4564
}
4665

47-
TEST(nsid_mntns_separate)
66+
TEST_F(nsid, mntns_separate)
4867
{
4968
__u64 parent_mnt_ns_id = 0;
5069
__u64 child_mnt_ns_id = 0;
@@ -90,6 +109,9 @@ TEST(nsid_mntns_separate)
90109
_exit(0);
91110
}
92111

112+
/* Track child for cleanup */
113+
self->child_pid = pid;
114+
93115
/* Parent process */
94116
close(pipefd[1]);
95117

@@ -99,8 +121,6 @@ TEST(nsid_mntns_separate)
99121

100122
if (buf == 'S') {
101123
/* Child couldn't create namespace, skip test */
102-
kill(pid, SIGTERM);
103-
waitpid(pid, NULL, 0);
104124
close(fd_parent_mntns);
105125
SKIP(return, "No permission to create mount namespace");
106126
}
@@ -123,10 +143,6 @@ TEST(nsid_mntns_separate)
123143

124144
close(fd_parent_mntns);
125145
close(fd_child_mntns);
126-
127-
/* Clean up child process */
128-
kill(pid, SIGTERM);
129-
waitpid(pid, NULL, 0);
130146
}
131147

132148
TEST(nsid_cgroupns_basic)
@@ -153,7 +169,7 @@ TEST(nsid_cgroupns_basic)
153169
close(fd_cgroupns);
154170
}
155171

156-
TEST(nsid_cgroupns_separate)
172+
TEST_F(nsid, cgroupns_separate)
157173
{
158174
__u64 parent_cgroup_ns_id = 0;
159175
__u64 child_cgroup_ns_id = 0;
@@ -199,6 +215,9 @@ TEST(nsid_cgroupns_separate)
199215
_exit(0);
200216
}
201217

218+
/* Track child for cleanup */
219+
self->child_pid = pid;
220+
202221
/* Parent process */
203222
close(pipefd[1]);
204223

@@ -208,8 +227,6 @@ TEST(nsid_cgroupns_separate)
208227

209228
if (buf == 'S') {
210229
/* Child couldn't create namespace, skip test */
211-
kill(pid, SIGTERM);
212-
waitpid(pid, NULL, 0);
213230
close(fd_parent_cgroupns);
214231
SKIP(return, "No permission to create cgroup namespace");
215232
}
@@ -232,10 +249,6 @@ TEST(nsid_cgroupns_separate)
232249

233250
close(fd_parent_cgroupns);
234251
close(fd_child_cgroupns);
235-
236-
/* Clean up child process */
237-
kill(pid, SIGTERM);
238-
waitpid(pid, NULL, 0);
239252
}
240253

241254
TEST(nsid_ipcns_basic)
@@ -262,7 +275,7 @@ TEST(nsid_ipcns_basic)
262275
close(fd_ipcns);
263276
}
264277

265-
TEST(nsid_ipcns_separate)
278+
TEST_F(nsid, ipcns_separate)
266279
{
267280
__u64 parent_ipc_ns_id = 0;
268281
__u64 child_ipc_ns_id = 0;
@@ -308,6 +321,9 @@ TEST(nsid_ipcns_separate)
308321
_exit(0);
309322
}
310323

324+
/* Track child for cleanup */
325+
self->child_pid = pid;
326+
311327
/* Parent process */
312328
close(pipefd[1]);
313329

@@ -317,8 +333,6 @@ TEST(nsid_ipcns_separate)
317333

318334
if (buf == 'S') {
319335
/* Child couldn't create namespace, skip test */
320-
kill(pid, SIGTERM);
321-
waitpid(pid, NULL, 0);
322336
close(fd_parent_ipcns);
323337
SKIP(return, "No permission to create IPC namespace");
324338
}
@@ -341,10 +355,6 @@ TEST(nsid_ipcns_separate)
341355

342356
close(fd_parent_ipcns);
343357
close(fd_child_ipcns);
344-
345-
/* Clean up child process */
346-
kill(pid, SIGTERM);
347-
waitpid(pid, NULL, 0);
348358
}
349359

350360
TEST(nsid_utsns_basic)
@@ -371,7 +381,7 @@ TEST(nsid_utsns_basic)
371381
close(fd_utsns);
372382
}
373383

374-
TEST(nsid_utsns_separate)
384+
TEST_F(nsid, utsns_separate)
375385
{
376386
__u64 parent_uts_ns_id = 0;
377387
__u64 child_uts_ns_id = 0;
@@ -417,6 +427,9 @@ TEST(nsid_utsns_separate)
417427
_exit(0);
418428
}
419429

430+
/* Track child for cleanup */
431+
self->child_pid = pid;
432+
420433
/* Parent process */
421434
close(pipefd[1]);
422435

@@ -426,8 +439,6 @@ TEST(nsid_utsns_separate)
426439

427440
if (buf == 'S') {
428441
/* Child couldn't create namespace, skip test */
429-
kill(pid, SIGTERM);
430-
waitpid(pid, NULL, 0);
431442
close(fd_parent_utsns);
432443
SKIP(return, "No permission to create UTS namespace");
433444
}
@@ -450,10 +461,6 @@ TEST(nsid_utsns_separate)
450461

451462
close(fd_parent_utsns);
452463
close(fd_child_utsns);
453-
454-
/* Clean up child process */
455-
kill(pid, SIGTERM);
456-
waitpid(pid, NULL, 0);
457464
}
458465

459466
TEST(nsid_userns_basic)
@@ -480,7 +487,7 @@ TEST(nsid_userns_basic)
480487
close(fd_userns);
481488
}
482489

483-
TEST(nsid_userns_separate)
490+
TEST_F(nsid, userns_separate)
484491
{
485492
__u64 parent_user_ns_id = 0;
486493
__u64 child_user_ns_id = 0;
@@ -526,6 +533,9 @@ TEST(nsid_userns_separate)
526533
_exit(0);
527534
}
528535

536+
/* Track child for cleanup */
537+
self->child_pid = pid;
538+
529539
/* Parent process */
530540
close(pipefd[1]);
531541

@@ -535,8 +545,6 @@ TEST(nsid_userns_separate)
535545

536546
if (buf == 'S') {
537547
/* Child couldn't create namespace, skip test */
538-
kill(pid, SIGTERM);
539-
waitpid(pid, NULL, 0);
540548
close(fd_parent_userns);
541549
SKIP(return, "No permission to create user namespace");
542550
}
@@ -559,10 +567,6 @@ TEST(nsid_userns_separate)
559567

560568
close(fd_parent_userns);
561569
close(fd_child_userns);
562-
563-
/* Clean up child process */
564-
kill(pid, SIGTERM);
565-
waitpid(pid, NULL, 0);
566570
}
567571

568572
TEST(nsid_timens_basic)
@@ -591,7 +595,7 @@ TEST(nsid_timens_basic)
591595
close(fd_timens);
592596
}
593597

594-
TEST(nsid_timens_separate)
598+
TEST_F(nsid, timens_separate)
595599
{
596600
__u64 parent_time_ns_id = 0;
597601
__u64 child_time_ns_id = 0;
@@ -652,6 +656,9 @@ TEST(nsid_timens_separate)
652656
}
653657
}
654658

659+
/* Track child for cleanup */
660+
self->child_pid = pid;
661+
655662
/* Parent process */
656663
close(pipefd[1]);
657664

@@ -660,8 +667,6 @@ TEST(nsid_timens_separate)
660667

661668
if (buf == 'S') {
662669
/* Child couldn't create namespace, skip test */
663-
kill(pid, SIGTERM);
664-
waitpid(pid, NULL, 0);
665670
close(fd_parent_timens);
666671
close(pipefd[0]);
667672
SKIP(return, "Cannot create time namespace");
@@ -689,10 +694,6 @@ TEST(nsid_timens_separate)
689694

690695
close(fd_parent_timens);
691696
close(fd_child_timens);
692-
693-
/* Clean up child process */
694-
kill(pid, SIGTERM);
695-
waitpid(pid, NULL, 0);
696697
}
697698

698699
TEST(nsid_pidns_basic)
@@ -719,7 +720,7 @@ TEST(nsid_pidns_basic)
719720
close(fd_pidns);
720721
}
721722

722-
TEST(nsid_pidns_separate)
723+
TEST_F(nsid, pidns_separate)
723724
{
724725
__u64 parent_pid_ns_id = 0;
725726
__u64 child_pid_ns_id = 0;
@@ -776,6 +777,9 @@ TEST(nsid_pidns_separate)
776777
}
777778
}
778779

780+
/* Track child for cleanup */
781+
self->child_pid = pid;
782+
779783
/* Parent process */
780784
close(pipefd[1]);
781785

@@ -784,8 +788,6 @@ TEST(nsid_pidns_separate)
784788

785789
if (buf == 'S') {
786790
/* Child couldn't create namespace, skip test */
787-
kill(pid, SIGTERM);
788-
waitpid(pid, NULL, 0);
789791
close(fd_parent_pidns);
790792
close(pipefd[0]);
791793
SKIP(return, "No permission to create PID namespace");
@@ -813,10 +815,6 @@ TEST(nsid_pidns_separate)
813815

814816
close(fd_parent_pidns);
815817
close(fd_child_pidns);
816-
817-
/* Clean up child process */
818-
kill(pid, SIGTERM);
819-
waitpid(pid, NULL, 0);
820818
}
821819

822820
TEST(nsid_netns_basic)
@@ -860,7 +858,7 @@ TEST(nsid_netns_basic)
860858
close(fd_netns);
861859
}
862860

863-
TEST(nsid_netns_separate)
861+
TEST_F(nsid, netns_separate)
864862
{
865863
__u64 parent_net_ns_id = 0;
866864
__u64 parent_netns_cookie = 0;
@@ -920,6 +918,9 @@ TEST(nsid_netns_separate)
920918
_exit(0);
921919
}
922920

921+
/* Track child for cleanup */
922+
self->child_pid = pid;
923+
923924
/* Parent process */
924925
close(pipefd[1]);
925926

@@ -929,8 +930,6 @@ TEST(nsid_netns_separate)
929930

930931
if (buf == 'S') {
931932
/* Child couldn't create namespace, skip test */
932-
kill(pid, SIGTERM);
933-
waitpid(pid, NULL, 0);
934933
close(fd_parent_netns);
935934
close(parent_sock);
936935
SKIP(return, "No permission to create network namespace");
@@ -977,10 +976,6 @@ TEST(nsid_netns_separate)
977976
close(fd_parent_netns);
978977
close(fd_child_netns);
979978
close(parent_sock);
980-
981-
/* Clean up child process */
982-
kill(pid, SIGTERM);
983-
waitpid(pid, NULL, 0);
984979
}
985980

986981
TEST_HARNESS_MAIN

0 commit comments

Comments
 (0)