Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

net: bpf: handle return value of post_bind{4,6} and add selftests for it #2375

Closed
wants to merge 4 commits into from

Conversation

kernel-patches-bot
Copy link

Pull request for series with
subject: net: bpf: handle return value of post_bind{4,6} and add selftests for it
version: 5
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=603210

@kernel-patches-bot
Copy link
Author

Master branch: 1372d34
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=603210
version: 5

@kernel-patches-bot
Copy link
Author

Master branch: 70bc793
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=603210
version: 5

@kernel-patches-bot
Copy link
Author

Master branch: e59618f
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=603210
version: 5

Nobody and others added 3 commits January 6, 2022 15:24
…IND()

The return value of BPF_CGROUP_RUN_PROG_INET{4,6}_POST_BIND() in
__inet_bind() is not handled properly. While the return value
is non-zero, it will set inet_saddr and inet_rcv_saddr to 0 and
exit:

	err = BPF_CGROUP_RUN_PROG_INET4_POST_BIND(sk);
	if (err) {
		inet->inet_saddr = inet->inet_rcv_saddr = 0;
		goto out_release_sock;
	}

Let's take UDP for example and see what will happen. For UDP
socket, it will be added to 'udp_prot.h.udp_table->hash' and
'udp_prot.h.udp_table->hash2' after the sk->sk_prot->get_port()
called success. If 'inet->inet_rcv_saddr' is specified here,
then 'sk' will be in the 'hslot2' of 'hash2' that it don't belong
to (because inet_saddr is changed to 0), and UDP packet received
will not be passed to this sock. If 'inet->inet_rcv_saddr' is not
specified here, the sock will work fine, as it can receive packet
properly, which is wired, as the 'bind()' is already failed.

To undo the get_port() operation, introduce the 'put_port' field
for 'struct proto'. For TCP proto, it is inet_put_port(); For UDP
proto, it is udp_lib_unhash(); For icmp proto, it is
ping_unhash().

Therefore, after sys_bind() fail caused by
BPF_CGROUP_RUN_PROG_INET4_POST_BIND(), it will be unbinded, which
means that it can try to be binded to another port.

Signed-off-by: Menglong Dong <imagedong@tencent.com>
Use C99 initializers for the initialization of 'tests' in test_sock.c.

Signed-off-by: Menglong Dong <imagedong@tencent.com>
@kernel-patches-bot
Copy link
Author

Master branch: 44bab87
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=603210
version: 5

With previous patch, kernel is able to 'put_port' after sys_bind()
fails. Add the test for that case: rebind another port after
sys_bind() fails. If the bind success, it means previous bind
operation is already undoed.

Signed-off-by: Menglong Dong <imagedong@tencent.com>
@kernel-patches-bot
Copy link
Author

At least one diff in series https://patchwork.kernel.org/project/netdevbpf/list/?series=603210 irrelevant now. Closing PR.

@kernel-patches-bot kernel-patches-bot deleted the series/601986=>bpf-next branch January 7, 2022 01:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
2 participants