rxrpc: Fix potential race in error handling in afs_make_call()
authorDavid Howells <dhowells@redhat.com>
Fri, 21 Apr 2023 22:03:46 +0000 (23:03 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sat, 22 Apr 2023 14:16:39 +0000 (15:16 +0100)
commite0416e7d33361d2ad0bf9f007428346579ac854a
tree9c840c2d1f4c72e457db4b9106dbbf54c6ba3281
parent92ce288ccb0d472977b24bd0b7240fc2490a6145
rxrpc: Fix potential race in error handling in afs_make_call()

If the rxrpc call set up by afs_make_call() receives an error whilst it is
transmitting the request, there's the possibility that it may get to the
point the rxrpc call is ended (after the error_kill_call label) just as the
call is queued for async processing.

This could manifest itself as call->rxcall being seen as NULL in
afs_deliver_to_call() when it tries to lock the call.

Fix this by splitting rxrpc_kernel_end_call() into a function to shut down
an rxrpc call and a function to release the caller's reference and calling
the latter only when we get to afs_put_call().

Reported-by: Jeffrey Altman <jaltman@auristor.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Tested-by: kafs-testing+fedora36_64checkkafs-build-306@auristor.com
cc: Marc Dionne <marc.dionne@auristor.com>
cc: "David S. Miller" <davem@davemloft.net>
cc: Eric Dumazet <edumazet@google.com>
cc: Jakub Kicinski <kuba@kernel.org>
cc: Paolo Abeni <pabeni@redhat.com>
cc: linux-afs@lists.infradead.org
cc: netdev@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/rxrpc.rst
fs/afs/rxrpc.c
include/net/af_rxrpc.h
net/rxrpc/af_rxrpc.c
net/rxrpc/rxperf.c