mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-18 12:22:27 -04:00
rxrpc: only handle RESPONSE during service challenge
Only process RESPONSE packets while the service connection is still in
RXRPC_CONN_SERVICE_CHALLENGING. Check that state under state_lock before
running response verification and security initialization, then use a local
secured flag to decide whether to queue the secured-connection work after
the state transition. This keeps duplicate or late RESPONSE packets from
re-running the setup path and removes the unlocked post-transition state
test.
Fixes: 17926a7932 ("[AF_RXRPC]: Provide secure RxRPC sockets for use by userspace and kernel both")
Reported-by: Yifan Wu <yifanwucs@gmail.com>
Reported-by: Juefei Pu <tomapufckgml@gmail.com>
Co-developed-by: Yuan Tan <yuantan098@gmail.com>
Signed-off-by: Yuan Tan <yuantan098@gmail.com>
Suggested-by: Xin Liu <bird@lzu.edu.cn>
Signed-off-by: Jie Wang <jiewang2024@lzu.edu.cn>
Signed-off-by: Yang Yang <n05ec@lzu.edu.cn>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: Jeffrey Altman <jaltman@auristor.com>
cc: Simon Horman <horms@kernel.org>
cc: linux-afs@lists.infradead.org
cc: stable@kernel.org
Link: https://patch.msgid.link/20260408121252.2249051-21-dhowells@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -247,6 +247,7 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
||||
bool secured = false;
|
||||
int ret;
|
||||
|
||||
if (conn->state == RXRPC_CONN_ABORTED)
|
||||
@@ -262,6 +263,13 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
|
||||
return ret;
|
||||
|
||||
case RXRPC_PACKET_TYPE_RESPONSE:
|
||||
spin_lock_irq(&conn->state_lock);
|
||||
if (conn->state != RXRPC_CONN_SERVICE_CHALLENGING) {
|
||||
spin_unlock_irq(&conn->state_lock);
|
||||
return 0;
|
||||
}
|
||||
spin_unlock_irq(&conn->state_lock);
|
||||
|
||||
ret = conn->security->verify_response(conn, skb);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@@ -272,11 +280,13 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
|
||||
return ret;
|
||||
|
||||
spin_lock_irq(&conn->state_lock);
|
||||
if (conn->state == RXRPC_CONN_SERVICE_CHALLENGING)
|
||||
if (conn->state == RXRPC_CONN_SERVICE_CHALLENGING) {
|
||||
conn->state = RXRPC_CONN_SERVICE;
|
||||
secured = true;
|
||||
}
|
||||
spin_unlock_irq(&conn->state_lock);
|
||||
|
||||
if (conn->state == RXRPC_CONN_SERVICE) {
|
||||
if (secured) {
|
||||
/* Offload call state flipping to the I/O thread. As
|
||||
* we've already received the packet, put it on the
|
||||
* front of the queue.
|
||||
|
||||
Reference in New Issue
Block a user