net: bpf: handle return value of post_bind{4,6} and add selftests for it#2349
net: bpf: handle return value of post_bind{4,6} and add selftests for it#2349kernel-patches-bot wants to merge 4 commits intobpf-nextfrom
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