diff options
| author | David Howells <[email protected]> | 2025-07-17 07:43:43 +0000 |
|---|---|---|
| committer | Jakub Kicinski <[email protected]> | 2025-07-17 14:50:48 +0000 |
| commit | 2fd895842d49c23137ae48252dd211e5d6d8a3ed (patch) | |
| tree | c38ab01bb1454b0f08f4c4607bb4ad97ab3af641 /net/switchdev/switchdev.c | |
| parent | rxrpc: Fix recv-recv race of completed call (diff) | |
| download | kernel-2fd895842d49c23137ae48252dd211e5d6d8a3ed.tar.gz kernel-2fd895842d49c23137ae48252dd211e5d6d8a3ed.zip | |
rxrpc: Fix notification vs call-release vs recvmsg
When a call is released, rxrpc takes the spinlock and removes it from
->recvmsg_q in an effort to prevent racing recvmsg() invocations from
seeing the same call. Now, rxrpc_recvmsg() only takes the spinlock when
actually removing a call from the queue; it doesn't, however, take it in
the lead up to that when it checks to see if the queue is empty. It *does*
hold the socket lock, which prevents a recvmsg/recvmsg race - but this
doesn't prevent sendmsg from ending the call because sendmsg() drops the
socket lock and relies on the call->user_mutex.
Fix this by firstly removing the bit in rxrpc_release_call() that dequeues
the released call and, instead, rely on recvmsg() to simply discard
released calls (done in a preceding fix).
Secondly, rxrpc_notify_socket() is abandoned if the call is already marked
as released rather than trying to be clever by setting both pointers in
call->recvmsg_link to NULL to trick list_empty(). This isn't perfect and
can still race, resulting in a released call on the queue, but recvmsg()
will now clean that up.
Fixes: 17926a79320a ("[AF_RXRPC]: Provide secure RxRPC sockets for use by userspace and kernel both")
Signed-off-by: David Howells <[email protected]>
Reviewed-by: Jeffrey Altman <[email protected]>
cc: Marc Dionne <[email protected]>
cc: Junvyyang, Tencent Zhuque Lab <[email protected]>
cc: LePremierHomme <[email protected]>
cc: Simon Horman <[email protected]>
cc: [email protected]
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Jakub Kicinski <[email protected]>
Diffstat (limited to 'net/switchdev/switchdev.c')
0 files changed, 0 insertions, 0 deletions
