mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-07-30 16:18:14 +02:00
rxrpc: only handle RESPONSE during service challenge
[ Upstream commitc43ffdcfdb] 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> [ adapted to spin_lock_bh usage, 3-arg verify_response(), and direct rxrpc_call_is_secure() ] Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
7bf5e0c485
commit
0afdfd4941
+13
-4
@@ -293,6 +293,7 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
|
||||
u32 *_abort_code)
|
||||
{
|
||||
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
||||
bool secured = false;
|
||||
__be32 wtmp;
|
||||
u32 abort_code;
|
||||
int loop, ret;
|
||||
@@ -337,6 +338,13 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
|
||||
_abort_code);
|
||||
|
||||
case RXRPC_PACKET_TYPE_RESPONSE:
|
||||
spin_lock_bh(&conn->state_lock);
|
||||
if (conn->state != RXRPC_CONN_SERVICE_CHALLENGING) {
|
||||
spin_unlock_bh(&conn->state_lock);
|
||||
return 0;
|
||||
}
|
||||
spin_unlock_bh(&conn->state_lock);
|
||||
|
||||
ret = conn->security->verify_response(conn, skb, _abort_code);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@@ -348,17 +356,18 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
|
||||
|
||||
spin_lock(&conn->bundle->channel_lock);
|
||||
spin_lock_bh(&conn->state_lock);
|
||||
|
||||
if (conn->state == RXRPC_CONN_SERVICE_CHALLENGING) {
|
||||
conn->state = RXRPC_CONN_SERVICE;
|
||||
spin_unlock_bh(&conn->state_lock);
|
||||
secured = true;
|
||||
}
|
||||
spin_unlock_bh(&conn->state_lock);
|
||||
|
||||
if (secured) {
|
||||
for (loop = 0; loop < RXRPC_MAXCALLS; loop++)
|
||||
rxrpc_call_is_secure(
|
||||
rcu_dereference_protected(
|
||||
conn->channels[loop].call,
|
||||
lockdep_is_held(&conn->bundle->channel_lock)));
|
||||
} else {
|
||||
spin_unlock_bh(&conn->state_lock);
|
||||
}
|
||||
|
||||
spin_unlock(&conn->bundle->channel_lock);
|
||||
|
||||
Reference in New Issue
Block a user