mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-27 04:22:58 +00:00
rxrpc: Fix NULL pointer deref due to call->conn being cleared on disconnect
[ Upstream commit5273a191dc] When a call is disconnected, the connection pointer from the call is cleared to make sure it isn't used again and to prevent further attempted transmission for the call. Unfortunately, there might be a daemon trying to use it at the same time to transmit a packet. Fix this by keeping call->conn set, but setting a flag on the call to indicate disconnection instead. Remove also the bits in the transmission functions where the conn pointer is checked and a ref taken under spinlock as this is now redundant. Fixes:8d94aa381d("rxrpc: Calls shouldn't hold socket refs") Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
6d80983dd0
commit
ce056ed455
@@ -493,7 +493,7 @@ void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call)
|
||||
|
||||
_debug("RELEASE CALL %p (%d CONN %p)", call, call->debug_id, conn);
|
||||
|
||||
if (conn)
|
||||
if (conn && !test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
|
||||
rxrpc_disconnect_call(call);
|
||||
if (call->security)
|
||||
call->security->free_call_crypto(call);
|
||||
@@ -569,6 +569,7 @@ static void rxrpc_rcu_destroy_call(struct rcu_head *rcu)
|
||||
struct rxrpc_call *call = container_of(rcu, struct rxrpc_call, rcu);
|
||||
struct rxrpc_net *rxnet = call->rxnet;
|
||||
|
||||
rxrpc_put_connection(call->conn);
|
||||
rxrpc_put_peer(call->peer);
|
||||
kfree(call->rxtx_buffer);
|
||||
kfree(call->rxtx_annotations);
|
||||
@@ -590,7 +591,6 @@ void rxrpc_cleanup_call(struct rxrpc_call *call)
|
||||
|
||||
ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE);
|
||||
ASSERT(test_bit(RXRPC_CALL_RELEASED, &call->flags));
|
||||
ASSERTCMP(call->conn, ==, NULL);
|
||||
|
||||
rxrpc_cleanup_ring(call);
|
||||
rxrpc_free_skb(call->tx_pending, rxrpc_skb_cleaned);
|
||||
|
||||
Reference in New Issue
Block a user