mirror of https://github.com/torvalds/linux.git
espintcp: use datagram_poll_queue for socket readiness
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: e27cca96cd ("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>
This commit is contained in:
parent
f6ceec6434
commit
0fc3e32c2c
|
|
@ -555,14 +555,10 @@ static void espintcp_close(struct sock *sk, long timeout)
|
||||||
static __poll_t espintcp_poll(struct file *file, struct socket *sock,
|
static __poll_t espintcp_poll(struct file *file, struct socket *sock,
|
||||||
poll_table *wait)
|
poll_table *wait)
|
||||||
{
|
{
|
||||||
__poll_t mask = datagram_poll(file, sock, wait);
|
|
||||||
struct sock *sk = sock->sk;
|
struct sock *sk = sock->sk;
|
||||||
struct espintcp_ctx *ctx = espintcp_getctx(sk);
|
struct espintcp_ctx *ctx = espintcp_getctx(sk);
|
||||||
|
|
||||||
if (!skb_queue_empty(&ctx->ike_queue))
|
return datagram_poll_queue(file, sock, wait, &ctx->ike_queue);
|
||||||
mask |= EPOLLIN | EPOLLRDNORM;
|
|
||||||
|
|
||||||
return mask;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void build_protos(struct proto *espintcp_prot,
|
static void build_protos(struct proto *espintcp_prot,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue