diff options
author | David Howells <dhowells@redhat.com> | 2017-10-20 12:01:22 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-10-21 22:05:39 -0400 |
commit | 6cb3ece9685f78f9b288dd2afea58c35784e40b8 (patch) | |
tree | 64c816bc23b70513cd8f44638d40486acbbc8fb2 /net | |
parent | 748759d57e1b33427113bad7dc685ea3c139649e (diff) |
rxrpc: Don't release call mutex on error pointer
Don't release call mutex at the end of rxrpc_kernel_begin_call() if the
call pointer actually holds an error value.
Fixes: 540b1c48c37a ("rxrpc: Fix deadlock between call creation and sendmsg/recvmsg")
Reported-by: Marc Dionne <marc.dionne@auristor.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/rxrpc/af_rxrpc.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c index fb17552fd292..4b0a8288c98a 100644 --- a/net/rxrpc/af_rxrpc.c +++ b/net/rxrpc/af_rxrpc.c | |||
@@ -308,10 +308,11 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock, | |||
308 | call = rxrpc_new_client_call(rx, &cp, srx, user_call_ID, tx_total_len, | 308 | call = rxrpc_new_client_call(rx, &cp, srx, user_call_ID, tx_total_len, |
309 | gfp); | 309 | gfp); |
310 | /* The socket has been unlocked. */ | 310 | /* The socket has been unlocked. */ |
311 | if (!IS_ERR(call)) | 311 | if (!IS_ERR(call)) { |
312 | call->notify_rx = notify_rx; | 312 | call->notify_rx = notify_rx; |
313 | mutex_unlock(&call->user_mutex); | ||
314 | } | ||
313 | 315 | ||
314 | mutex_unlock(&call->user_mutex); | ||
315 | _leave(" = %p", call); | 316 | _leave(" = %p", call); |
316 | return call; | 317 | return call; |
317 | } | 318 | } |