rxrpc: Fix leak of rxrpc_peer objects
When a new client call is requested, an rxrpc_conn_parameters struct object
is passed in with a bunch of parameters set, such as the local endpoint to
use. A pointer to the target peer record is also placed in there by
rxrpc_get_client_conn() - and this is removed if and only if a new
connection object is allocated. Thus it leaks if a new connection object
isn't allocated.
Fix this by putting any peer object attached to the rxrpc_conn_parameters
object in the function that allocated it.
Fixes: 19ffa01c9c ("rxrpc: Use structs to hold connection params and protocol info")
Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
@@ -463,6 +463,27 @@ void rxrpc_put_peer(struct rxrpc_peer *peer)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure all peer records have been discarded.
|
||||
*/
|
||||
void rxrpc_destroy_all_peers(struct rxrpc_net *rxnet)
|
||||
{
|
||||
struct rxrpc_peer *peer;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < HASH_SIZE(rxnet->peer_hash); i++) {
|
||||
if (hlist_empty(&rxnet->peer_hash[i]))
|
||||
continue;
|
||||
|
||||
hlist_for_each_entry(peer, &rxnet->peer_hash[i], hash_link) {
|
||||
pr_err("Leaked peer %u {%u} %pISp\n",
|
||||
peer->debug_id,
|
||||
atomic_read(&peer->usage),
|
||||
&peer->srx.transport);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* rxrpc_kernel_get_peer - Get the peer address of a call
|
||||
* @sock: The socket on which the call is in progress.
|
||||
|
||||
Reference in New Issue
Block a user