-
Notifications
You must be signed in to change notification settings - Fork 148
net: bpf: handle return value of post_bind{4,6} and add selftests for it #2349
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
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