diff options
author | David Howells <dhowells@redhat.com> | 2016-09-17 10:49:13 +0100 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2016-09-17 10:53:55 +0100 |
commit | 27d0fc431c6b4847231c1490fa541bc3f5a7a351 (patch) | |
tree | 48e5fca210eb0692a657d3b336565fb0efb11812 /net/rxrpc/output.c | |
parent | dfa7d9204054b091949d87270e55e0fd5800c3ae (diff) | |
download | linux-stable-27d0fc431c6b4847231c1490fa541bc3f5a7a351.tar.gz linux-stable-27d0fc431c6b4847231c1490fa541bc3f5a7a351.tar.bz2 linux-stable-27d0fc431c6b4847231c1490fa541bc3f5a7a351.zip |
rxrpc: Don't transmit an ACK if there's no reason set
Don't transmit an ACK if call->ackr_reason in unset. There's the
possibility of a race between recvmsg() sending an ACK and the background
processing thread trying to send the same one.
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'net/rxrpc/output.c')
-rw-r--r-- | net/rxrpc/output.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c index 06a9aca739d1..aa0507214b31 100644 --- a/net/rxrpc/output.c +++ b/net/rxrpc/output.c @@ -137,6 +137,11 @@ int rxrpc_send_call_packet(struct rxrpc_call *call, u8 type) switch (type) { case RXRPC_PACKET_TYPE_ACK: spin_lock_bh(&call->lock); + if (!call->ackr_reason) { + spin_unlock_bh(&call->lock); + ret = 0; + goto out; + } n = rxrpc_fill_out_ack(call, pkt); call->ackr_reason = 0; |