summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXu Kuohai <xukuohai@huawei.com>2023-08-04 03:37:37 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-08-16 18:22:00 +0200
commit20d53895d5c0789f2409d0fe41c4877f367f7f03 (patch)
treecf949bb1e8b1cf7882969efdb6904c4f4498734f
parenta09c258cfa77d3ba0a7acc555c73eb6b005c4bd8 (diff)
downloadlinux-20d53895d5c0789f2409d0fe41c4877f367f7f03.tar.gz
linux-20d53895d5c0789f2409d0fe41c4877f367f7f03.tar.bz2
linux-20d53895d5c0789f2409d0fe41c4877f367f7f03.zip
bpf, sockmap: Fix map type error in sock_map_del_link
commit 7e96ec0e6605b69bb21bbf6c0ff9051e656ec2b1 upstream. sock_map_del_link() operates on both SOCKMAP and SOCKHASH, although both types have member named "progs", the offset of "progs" member in these two types is different, so "progs" should be accessed with the real map type. Fixes: 604326b41a6f ("bpf, sockmap: convert to generic sk_msg interface") Signed-off-by: Xu Kuohai <xukuohai@huawei.com> Reviewed-by: John Fastabend <john.fastabend@gmail.com> Link: https://lore.kernel.org/r/20230804073740.194770-2-xukuohai@huaweicloud.com Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--net/core/sock_map.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/net/core/sock_map.c b/net/core/sock_map.c
index 85d3c62bdfa6..caae43e66353 100644
--- a/net/core/sock_map.c
+++ b/net/core/sock_map.c
@@ -148,13 +148,13 @@ static void sock_map_del_link(struct sock *sk,
list_for_each_entry_safe(link, tmp, &psock->link, list) {
if (link->link_raw == link_raw) {
struct bpf_map *map = link->map;
- struct bpf_stab *stab = container_of(map, struct bpf_stab,
- map);
- if (psock->saved_data_ready && stab->progs.stream_parser)
+ struct sk_psock_progs *progs = sock_map_progs(map);
+
+ if (psock->saved_data_ready && progs->stream_parser)
strp_stop = true;
- if (psock->saved_data_ready && stab->progs.stream_verdict)
+ if (psock->saved_data_ready && progs->stream_verdict)
verdict_stop = true;
- if (psock->saved_data_ready && stab->progs.skb_verdict)
+ if (psock->saved_data_ready && progs->skb_verdict)
verdict_stop = true;
list_del(&link->list);
sk_psock_free_link(link);