diff options
author | David Howells <dhowells@redhat.com> | 2016-09-17 05:49:13 -0400 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2016-09-17 05:53:55 -0400 |
commit | 27d0fc431c6b4847231c1490fa541bc3f5a7a351 (patch) | |
tree | 48e5fca210eb0692a657d3b336565fb0efb11812 /net | |
parent | dfa7d9204054b091949d87270e55e0fd5800c3ae (diff) |
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')
-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) | |||
137 | switch (type) { | 137 | switch (type) { |
138 | case RXRPC_PACKET_TYPE_ACK: | 138 | case RXRPC_PACKET_TYPE_ACK: |
139 | spin_lock_bh(&call->lock); | 139 | spin_lock_bh(&call->lock); |
140 | if (!call->ackr_reason) { | ||
141 | spin_unlock_bh(&call->lock); | ||
142 | ret = 0; | ||
143 | goto out; | ||
144 | } | ||
140 | n = rxrpc_fill_out_ack(call, pkt); | 145 | n = rxrpc_fill_out_ack(call, pkt); |
141 | call->ackr_reason = 0; | 146 | call->ackr_reason = 0; |
142 | 147 | ||