rxrpc: Fix use-after-free in rxrpc_put_local()
authorDavid Howells <dhowells@redhat.com>
Thu, 30 Jan 2020 21:50:35 +0000 (21:50 +0000)
committerDavid Howells <dhowells@redhat.com>
Thu, 30 Jan 2020 21:50:41 +0000 (21:50 +0000)
Fix rxrpc_put_local() to not access local->debug_id after calling
atomic_dec_return() as, unless that returned n==0, we no longer have the
right to access the object.

Fixes: 06d9532fa6b3 ("rxrpc: Fix read-after-free in rxrpc_queue_local()")
Signed-off-by: David Howells <dhowells@redhat.com>
net/rxrpc/local_object.c

index 36587260cabd99b280372b9fe0fda70e300bae44..3aa179efcda43f2245fd2c71a1af219620d7d097 100644 (file)
@@ -364,11 +364,14 @@ void rxrpc_queue_local(struct rxrpc_local *local)
 void rxrpc_put_local(struct rxrpc_local *local)
 {
        const void *here = __builtin_return_address(0);
+       unsigned int debug_id;
        int n;
 
        if (local) {
+               debug_id = local->debug_id;
+
                n = atomic_dec_return(&local->usage);
-               trace_rxrpc_local(local->debug_id, rxrpc_local_put, n, here);
+               trace_rxrpc_local(debug_id, rxrpc_local_put, n, here);
 
                if (n == 0)
                        call_rcu(&local->rcu, rxrpc_local_rcu);