1 // SPDX-License-Identifier: GPL-2.0
3 #include <test_progs.h>
4 #include "test_deny_namespace.skel.h"
6 #include "cap_helpers.h"
9 static int wait_for_pid(pid_t pid)
14 ret = waitpid(pid, &status, 0);
22 if (!WIFEXITED(status))
25 return WEXITSTATUS(status);
28 /* negative return value -> some internal error
29 * positive return value -> userns creation failed
30 * 0 -> userns creation succeeded
32 static int create_user_ns(void)
41 if (unshare(CLONE_NEWUSER))
46 return wait_for_pid(pid);
49 static void test_userns_create_bpf(void)
51 __u32 cap_mask = 1ULL << CAP_SYS_ADMIN;
54 cap_enable_effective(cap_mask, &old_caps);
56 ASSERT_OK(create_user_ns(), "priv new user ns");
58 cap_disable_effective(cap_mask, &old_caps);
60 ASSERT_EQ(create_user_ns(), EPERM, "unpriv new user ns");
62 if (cap_mask & old_caps)
63 cap_enable_effective(cap_mask, NULL);
66 static void test_unpriv_userns_create_no_bpf(void)
68 __u32 cap_mask = 1ULL << CAP_SYS_ADMIN;
71 cap_disable_effective(cap_mask, &old_caps);
73 ASSERT_OK(create_user_ns(), "no-bpf unpriv new user ns");
75 if (cap_mask & old_caps)
76 cap_enable_effective(cap_mask, NULL);
79 void test_deny_namespace(void)
81 struct test_deny_namespace *skel = NULL;
84 if (test__start_subtest("unpriv_userns_create_no_bpf"))
85 test_unpriv_userns_create_no_bpf();
87 skel = test_deny_namespace__open_and_load();
88 if (!ASSERT_OK_PTR(skel, "skel load"))
91 err = test_deny_namespace__attach(skel);
92 if (!ASSERT_OK(err, "attach"))
95 if (test__start_subtest("userns_create_bpf"))
96 test_userns_create_bpf();
98 test_deny_namespace__detach(skel);
101 test_deny_namespace__destroy(skel);