summary refs log tree commit diff
path: root/net
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:27:26 +0200
commited90fe7435c573897c2ab7624f24d67c866f94a9 (patch)
treefae676ef2265c12d66475f3843603ff836fd3e0d /net
parent20acffcdc2b74fb7dcc4e299f7aca173df89d911 (diff)
downloadlinux-ed90fe7435c573897c2ab7624f24d67c866f94a9.tar.gz
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>
Diffstat (limited to 'net')
-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 c84e5073c0b6..96db7409baa1 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);