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>
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+
2342TEST (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
132148TEST (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
241254TEST (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
350360TEST (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
459466TEST (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
568572TEST (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
698699TEST (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
822820TEST (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
986981TEST_HARNESS_MAIN
0 commit comments