Skip to content

Commit

Permalink
net, sunrpc: Remap EPERM in case of connection failure in xs_tcp_setu…
Browse files Browse the repository at this point in the history
…p_socket

commit 626dfed upstream.

When using a BPF program on kernel_connect(), the call can return -EPERM. This
causes xs_tcp_setup_socket() to loop forever, filling up the syslog and causing
the kernel to potentially freeze up.

Neil suggested:

  This will propagate -EPERM up into other layers which might not be ready
  to handle it. It might be safer to map EPERM to an error we would be more
  likely to expect from the network system - such as ECONNREFUSED or ENETDOWN.

ECONNREFUSED as error seems reasonable. For programs setting a different error
can be out of reach (see handling in 4fbac77) in particular on kernels
which do not have f10d059 ("bpf: Make BPF_PROG_RUN_ARRAY return -err
instead of allow boolean"), thus given that it is better to simply remap for
consistent behavior. UDP does handle EPERM in xs_udp_send_request().

Fixes: d74bad4 ("bpf: Hooks for sys_connect")
Fixes: 4fbac77 ("bpf: Hooks for sys_bind")
Co-developed-by: Lex Siegel <[email protected]>
Signed-off-by: Lex Siegel <[email protected]>
Signed-off-by: Daniel Borkmann <[email protected]>
Cc: Neil Brown <[email protected]>
Cc: Trond Myklebust <[email protected]>
Cc: Anna Schumaker <[email protected]>
Link: cilium/cilium#33395
Link: https://lore.kernel.org/bpf/[email protected]
Link: https://patch.msgid.link/9069ec1d59e4b2129fc23433349fd5580ad43921.1720075070.git.daniel@iogearbox.net
Signed-off-by: Paolo Abeni <[email protected]>
Signed-off-by: Hugo SIMELIERE <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
borkmann authored and gregkh committed Sep 12, 2024
1 parent ba2af64 commit 5d8254e
Showing 1 changed file with 7 additions and 0 deletions.
7 changes: 7 additions & 0 deletions net/sunrpc/xprtsock.c
Original file line number Diff line number Diff line change
Expand Up @@ -2335,6 +2335,13 @@ static void xs_tcp_setup_socket(struct work_struct *work)
case -EALREADY:
xprt_unlock_connect(xprt, transport);
return;
case -EPERM:
/* Happens, for instance, if a BPF program is preventing
* the connect. Remap the error so upper layers can better
* deal with it.
*/
status = -ECONNREFUSED;
fallthrough;
case -EINVAL:
/* Happens, for instance, if the user specified a link
* local IPv6 address without a scope-id.
Expand Down

0 comments on commit 5d8254e

Please sign in to comment.