rxrpc: Accesses of rxrpc_local::service need to be RCU managed
authorDavid Howells <dhowells@redhat.com>
Thu, 6 Oct 2016 07:11:48 +0000 (08:11 +0100)
committerDavid Howells <dhowells@redhat.com>
Thu, 6 Oct 2016 07:11:48 +0000 (08:11 +0100)
struct rxrpc_local->service is marked __rcu - this means that accesses of
it need to be managed using RCU wrappers.  There are two such places in
rxrpc_release_sock() where the value is checked and cleared.  Fix this by
using the appropriate wrappers.

Signed-off-by: David Howells <dhowells@redhat.com>
net/rxrpc/af_rxrpc.c

index 44c9c2b0b190dedde7c22b08284f8748ed29e5cb..2d59c9be40e1b53976497f92b28b54acb411e20e 100644 (file)
@@ -678,9 +678,9 @@ static int rxrpc_release_sock(struct sock *sk)
        sk->sk_state = RXRPC_CLOSE;
        spin_unlock_bh(&sk->sk_receive_queue.lock);
 
-       if (rx->local && rx->local->service == rx) {
+       if (rx->local && rcu_access_pointer(rx->local->service) == rx) {
                write_lock(&rx->local->services_lock);
-               rx->local->service = NULL;
+               rcu_assign_pointer(rx->local->service, NULL);
                write_unlock(&rx->local->services_lock);
        }