Files
Marc Dionne af2afdd3b6 rxrpc: Fix recvmsg() unconditional requeue
JIRA: https://issues.redhat.com/browse/RHEL-147231
CVE: CVE-2026-23066

commit 2c28769a51deb6022d7fbd499987e237a01dd63a
Author: David Howells <dhowells@redhat.com>
Date:   Wed Jan 14 22:03:23 2026 +0000

    rxrpc: Fix recvmsg() unconditional requeue

    If rxrpc_recvmsg() fails because MSG_DONTWAIT was specified but the call at
    the front of the recvmsg queue already has its mutex locked, it requeues
    the call - whether or not the call is already queued.  The call may be on
    the queue because MSG_PEEK was also passed and so the call was not dequeued
    or because the I/O thread requeued it.

    The unconditional requeue may then corrupt the recvmsg queue, leading to
    things like UAFs or refcount underruns.

    Fix this by only requeuing the call if it isn't already on the queue - and
    moving it to the front if it is already queued.  If we don't queue it, we
    have to put the ref we obtained by dequeuing it.

    Also, MSG_PEEK doesn't dequeue the call so shouldn't call
    rxrpc_notify_socket() for the call if we didn't use up all the data on the
    queue, so fix that also.

    Fixes: 540b1c48c3 ("rxrpc: Fix deadlock between call creation and sendmsg/recvmsg")
    Reported-by: Faith <faith@zellic.io>
    Reported-by: Pumpkin Chang <pumpkin@devco.re>
    Signed-off-by: David Howells <dhowells@redhat.com>
    Acked-by: Marc Dionne <marc.dionne@auristor.com>
    cc: Nir Ohfeld <niro@wiz.io>
    cc: Willy Tarreau <w@1wt.eu>
    cc: Simon Horman <horms@kernel.org>
    cc: linux-afs@lists.infradead.org
    cc: stable@kernel.org
    Link: https://patch.msgid.link/95163.1768428203@warthog.procyon.org.uk
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>

Signed-off-by: Marc Dionne <mdionne@redhat.com>
2026-02-26 10:11:58 -04:00
..