Thread (6 messages) flat view 6 messages, 2 authors, 2021-01-27

Re: [PATCH bpf-next v3 2/2] selftests/bpf: verify that rebinding to port < 1024 from BPF works

From: Stanislav Fomichev <hidden>
Date: 2021-01-26 22:54:52
Also in: bpf

On Tue, Jan 26, 2021 at 10:18 AM Martin KaFai Lau [off-list ref] wrote:
On Tue, Jan 26, 2021 at 08:51:04AM -0800, Stanislav Fomichev wrote:
quoted
Return 3 to indicate that permission check for port 111
should be skipped.
[ ... ]
quoted
+void cap_net_bind_service(cap_flag_value_t flag)
+{
+     const cap_value_t cap_net_bind_service = CAP_NET_BIND_SERVICE;
+     cap_t caps;
+
+     caps = cap_get_proc();
+     if (CHECK(!caps, "cap_get_proc", "errno %d", errno))
+             goto free_caps;
+
+     if (CHECK(cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_net_bind_service,
+                            flag),
+               "cap_set_flag", "errno %d", errno))
+             goto free_caps;
+
+     if (CHECK(cap_set_proc(caps), "cap_set_proc", "errno %d", errno))
+             goto free_caps;
+
+free_caps:
+     if (CHECK(cap_free(caps), "cap_free", "errno %d", errno))
+             goto free_caps;
Also mentioned in v2, there is a loop.
Oops, missed that one, sorry.
quoted
+}
+
+void test_bind_perm(void)
+{
+     struct bind_perm *skel;
+     int cgroup_fd;
+
+     cgroup_fd = test__join_cgroup("/bind_perm");
+     if (CHECK(cgroup_fd < 0, "cg-join", "errno %d", errno))
+             return;
+
+     skel = bind_perm__open_and_load();
+     if (!ASSERT_OK_PTR(skel, "skel"))
+             goto close_cgroup_fd;
+
+     skel->links.bind_v4_prog = bpf_program__attach_cgroup(skel->progs.bind_v4_prog, cgroup_fd);
+     if (!ASSERT_OK_PTR(skel, "bind_v4_prog"))
+             goto close_skeleton;
+
+     cap_net_bind_service(CAP_CLEAR);
+     try_bind(110, EACCES);
+     try_bind(111, 0);
+     cap_net_bind_service(CAP_SET);
Instead of always CAP_SET at the end of the test,
it is better to do a cap_get_flag() to save the original value
at the beginning of the test and restore it at the end
of the test.
It might be easier to change cap_net_bind_service() to return a bool
which indicates that the flag was originally set.
If it wasn't, we can bypass cap_net_bind_service(CAP_SET).
Let me know if you strongly disagree, I'll try to play with this idea
and will send a v4 if it plays out nicely.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help