-
Notifications
You must be signed in to change notification settings - Fork 103
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 #2349
Conversation
Master branch: 35580f9 |
Master branch: 35580f9 |
e6a23e3
to
dfcf9c8
Compare
Master branch: 63d000c |
dfcf9c8
to
00f095e
Compare
Master branch: 11f9983 |
00f095e
to
d536845
Compare
11f9983
to
9e6b19a
Compare
Master branch: 9e6b19a |
d536845
to
bffd947
Compare
Master branch: e63a023 |
bffd947
to
156b9a0
Compare
Master branch: 5e22dd1 |
156b9a0
to
3d81ba8
Compare
Master branch: 5e22dd1 |
3d81ba8
to
d8c03a6
Compare
At least one diff in series https://patchwork.kernel.org/project/netdevbpf/list/?series=602887 expired. Closing PR. |
Master branch: 640a171 |
d8c03a6
to
ba6ce7a
Compare
Master branch: 1372d34 |
…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>
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>
Use C99 initializers for the initialization of 'tests' in test_sock.c. Signed-off-by: Menglong Dong <imagedong@tencent.com>
ba6ce7a
to
4661839
Compare
At least one diff in series https://patchwork.kernel.org/project/netdevbpf/list/?series=603077 irrelevant now. Closing PR. |
Pull request for series with
subject: net: bpf: handle return value of post_bind{4,6} and add selftests for it
version: 2
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=601986