]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
espintcp: use datagram_poll_queue for socket readiness
authorRalf Lici <ralf@mandelbit.com>
Tue, 21 Oct 2025 10:09:41 +0000 (12:09 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 23 Oct 2025 13:46:04 +0000 (15:46 +0200)
espintcp uses a custom queue (ike_queue) to deliver packets to
userspace. The polling logic relies on datagram_poll, which checks
sk_receive_queue, which can lead to false readiness signals when that
queue contains non-userspace packets.

Switch espintcp_poll to use datagram_poll_queue with ike_queue, ensuring
poll only signals readiness when userspace data is actually available.

Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
Signed-off-by: Ralf Lici <ralf@mandelbit.com>
Reviewed-by: Sabrina Dubroca <sd@queasysnail.net>
Link: https://patch.msgid.link/20251021100942.195010-3-ralf@mandelbit.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/xfrm/espintcp.c

index fc7a603b04f130062440834ad1af7ae6367c0f41..bf744ac9d5a73e04c3ff58151f305a3b4164a4b0 100644 (file)
@@ -555,14 +555,10 @@ static void espintcp_close(struct sock *sk, long timeout)
 static __poll_t espintcp_poll(struct file *file, struct socket *sock,
                              poll_table *wait)
 {
-       __poll_t mask = datagram_poll(file, sock, wait);
        struct sock *sk = sock->sk;
        struct espintcp_ctx *ctx = espintcp_getctx(sk);
 
-       if (!skb_queue_empty(&ctx->ike_queue))
-               mask |= EPOLLIN | EPOLLRDNORM;
-
-       return mask;
+       return datagram_poll_queue(file, sock, wait, &ctx->ike_queue);
 }
 
 static void build_protos(struct proto *espintcp_prot,