mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
sctp: add bpf_bypass_getsockopt proto callback
Implement ->bpf_bypass_getsockopt proto callback and filter out
SCTP_SOCKOPT_PEELOFF, SCTP_SOCKOPT_PEELOFF_FLAGS and SCTP_SOCKOPT_CONNECTX3
socket options from running eBPF hook on them.
SCTP_SOCKOPT_PEELOFF and SCTP_SOCKOPT_PEELOFF_FLAGS options do fd_install(),
and if BPF_CGROUP_RUN_PROG_GETSOCKOPT hook returns an error after success of
the original handler sctp_getsockopt(...), userspace will receive an error
from getsockopt syscall and will be not aware that fd was successfully
installed into a fdtable.
As pointed by Marcelo Ricardo Leitner it seems reasonable to skip
bpf getsockopt hook for SCTP_SOCKOPT_CONNECTX3 sockopt too.
Because internaly, it triggers connect() and if error is masked
then userspace will be confused.
This patch was born as a result of discussion around a new SCM_PIDFD interface:
https://lore.kernel.org/all/20230413133355.350571-3-aleksandr.mikhalitsyn@canonical.com/
Fixes: 0d01da6afc
("bpf: implement getsockopt and setsockopt hooks")
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Christian Brauner <brauner@kernel.org>
Cc: Stanislav Fomichev <sdf@google.com>
Cc: Neil Horman <nhorman@tuxdriver.com>
Cc: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Cc: Xin Long <lucien.xin@gmail.com>
Cc: linux-sctp@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: netdev@vger.kernel.org
Suggested-by: Stanislav Fomichev <sdf@google.com>
Acked-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com>
Acked-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e7ea5080ef
commit
2598619e01
@ -8281,6 +8281,22 @@ static int sctp_getsockopt(struct sock *sk, int level, int optname,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static bool sctp_bpf_bypass_getsockopt(int level, int optname)
|
||||
{
|
||||
if (level == SOL_SCTP) {
|
||||
switch (optname) {
|
||||
case SCTP_SOCKOPT_PEELOFF:
|
||||
case SCTP_SOCKOPT_PEELOFF_FLAGS:
|
||||
case SCTP_SOCKOPT_CONNECTX3:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int sctp_hash(struct sock *sk)
|
||||
{
|
||||
/* STUB */
|
||||
@ -9650,6 +9666,7 @@ struct proto sctp_prot = {
|
||||
.shutdown = sctp_shutdown,
|
||||
.setsockopt = sctp_setsockopt,
|
||||
.getsockopt = sctp_getsockopt,
|
||||
.bpf_bypass_getsockopt = sctp_bpf_bypass_getsockopt,
|
||||
.sendmsg = sctp_sendmsg,
|
||||
.recvmsg = sctp_recvmsg,
|
||||
.bind = sctp_bind,
|
||||
@ -9705,6 +9722,7 @@ struct proto sctpv6_prot = {
|
||||
.shutdown = sctp_shutdown,
|
||||
.setsockopt = sctp_setsockopt,
|
||||
.getsockopt = sctp_getsockopt,
|
||||
.bpf_bypass_getsockopt = sctp_bpf_bypass_getsockopt,
|
||||
.sendmsg = sctp_sendmsg,
|
||||
.recvmsg = sctp_recvmsg,
|
||||
.bind = sctp_bind,
|
||||
|
Loading…
Reference in New Issue
Block a user