aboutsummaryrefslogtreecommitdiff
path: root/net/core
diff options
context:
space:
mode:
authorGravatar John Fastabend <john.fastabend@gmail.com> 2021-07-27 09:04:58 -0700
committerGravatar Andrii Nakryiko <andrii@kernel.org> 2021-07-27 14:55:10 -0700
commit343597d558e79fe704ba8846b5b2ed24056b89c2 (patch)
tree9be3342dfefbd6f63c068e83232f03931fe32b55 /net/core
parentbpf: Fix OOB read when printing XDP link fdinfo (diff)
downloadlinux-343597d558e79fe704ba8846b5b2ed24056b89c2.tar.gz
linux-343597d558e79fe704ba8846b5b2ed24056b89c2.tar.bz2
linux-343597d558e79fe704ba8846b5b2ed24056b89c2.zip
bpf, sockmap: Zap ingress queues after stopping strparser
We don't want strparser to run and pass skbs into skmsg handlers when the psock is null. We just sk_drop them in this case. When removing a live socket from map it means extra drops that we do not need to incur. Move the zap below strparser close to avoid this condition. This way we stop the stream parser first stopping it from processing packets and then delete the psock. Fixes: a136678c0bdbb ("bpf: sk_msg, zap ingress queue on psock down") Signed-off-by: John Fastabend <john.fastabend@gmail.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Acked-by: Jakub Sitnicki <jakub@cloudflare.com> Acked-by: Martin KaFai Lau <kafai@fb.com> Link: https://lore.kernel.org/bpf/20210727160500.1713554-2-john.fastabend@gmail.com
Diffstat (limited to 'net/core')
-rw-r--r--net/core/skmsg.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/net/core/skmsg.c b/net/core/skmsg.c
index 15d71288e741..28115ef742e8 100644
--- a/net/core/skmsg.c
+++ b/net/core/skmsg.c
@@ -773,8 +773,6 @@ static void sk_psock_destroy(struct work_struct *work)
void sk_psock_drop(struct sock *sk, struct sk_psock *psock)
{
- sk_psock_stop(psock, false);
-
write_lock_bh(&sk->sk_callback_lock);
sk_psock_restore_proto(sk, psock);
rcu_assign_sk_user_data(sk, NULL);
@@ -784,6 +782,8 @@ void sk_psock_drop(struct sock *sk, struct sk_psock *psock)
sk_psock_stop_verdict(sk, psock);
write_unlock_bh(&sk->sk_callback_lock);
+ sk_psock_stop(psock, false);
+
INIT_RCU_WORK(&psock->rwork, sk_psock_destroy);
queue_rcu_work(system_wq, &psock->rwork);
}