FAILED: patch "[PATCH] bpf: sockmap: Require attach_bpf_fd when detaching a program" failed to apply to 5.4-stable tree
Subsystems (6)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From bb0de3131f4c60a9bf976681e0fe4d1e55c7a821 Mon Sep 17 00:00:00 2001
From: Lorenz Bauer <[email protected]>
Date: Mon, 29 Jun 2020 10:56:28 +0100
Subject: [PATCH] bpf: sockmap: Require attach_bpf_fd when detaching a program
The sockmap code currently ignores the value of attach_bpf_fd when detaching a program. This is contrary to the usual behaviour of checking that attach_bpf_fd represents the currently attached program.
Ensure that attach_bpf_fd is indeed the currently attached program. It turns out that all sockmap selftests already do this, which indicates that this is unlikely to cause breakage.
include/linux/bpf.h +11 -2
@@ -1543,13 +1543,16 @@ static inline void bpf_map_offload_map_free(struct bpf_map *map)#endif /* CONFIG_NET && CONFIG_BPF_SYSCALL */ #if defined(CONFIG_BPF_STREAM_PARSER ) -int sock_map_prog_update (struct bpf_map *map,struct bpf_prog *prog,u32 which); +int sock_map_prog_update (struct bpf_map *map,struct bpf_prog *prog, +struct bpf_prog *old,u32 which);int sock_map_get_from_fd (const union bpf_attr *attr,struct bpf_prog *prog); +int sock_map_prog_detach (const union bpf_attr *attr,enum bpf_prog_type ptype);void sock_map_unhash (struct sock *sk);void sock_map_close (struct sock *sk,long timeout);#else static inline int sock_map_prog_update (struct bpf_map *map, -struct bpf_prog *prog,u32 which) +struct bpf_prog *prog, +struct bpf_prog *old,u32 which) {return -EOPNOTSUPP ; }
@@ -1559,6 +1562,12 @@ static inline int sock_map_get_from_fd(const union bpf_attr *attr, {return -EINVAL ; } + +static inline int sock_map_prog_detach (const union bpf_attr *attr, +enum bpf_prog_type ptype) +{ +return -EOPNOTSUPP ; +}#endif /* CONFIG_BPF_STREAM_PARSER */ #if defined(CONFIG_INET ) && defined(CONFIG_BPF_SYSCALL )
include/linux/skmsg.h +13 -0
@@ -430,6 +430,19 @@ static inline void psock_set_prog(struct bpf_prog **pprog,bpf_prog_put (prog); } +static inline int psock_replace_prog (struct bpf_prog **pprog, +struct bpf_prog *prog, +struct bpf_prog *old) +{ +if (cmpxchg (pprog, old, prog) != old) +return -ENOENT ; + +if (old) +bpf_prog_put (old); + +return 0 ; +} +static inline void psock_progs_drop (struct sk_psock_progs *progs) {psock_set_prog (&progs->msg_parser,NULL );
kernel/bpf/syscall.c +1 -1
@@ -2893,7 +2893,7 @@ static int bpf_prog_detach(const union bpf_attr *attr)switch (ptype) {case BPF_PROG_TYPE_SK_MSG :case BPF_PROG_TYPE_SK_SKB : -return sock_map_get_from_fd (attr,NULL ); +return sock_map_prog_detach (attr, ptype);case BPF_PROG_TYPE_LIRC_MODE2 :return lirc_prog_detach (attr);case BPF_PROG_TYPE_FLOW_DISSECTOR :
net/core/sock_map.c +45 -5
79 lines not on this page · raw message