]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
rxrpc: only handle RESPONSE during service challenge
authorWang Jie <jiewang2024@lzu.edu.cn>
Wed, 8 Apr 2026 12:12:48 +0000 (13:12 +0100)
committerJakub Kicinski <kuba@kernel.org>
Thu, 9 Apr 2026 01:45:05 +0000 (18:45 -0700)
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: 17926a79320a ("[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>
net/rxrpc/conn_event.c

index c50cbfc5a313c22155116171119d14573d18b95b..9a41ec708aeb9f5ee0c4edc1548e54d54bf7d9df 100644 (file)
@@ -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.