Browse Source

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>
David Howells 9 years ago
parent
commit
27d0fc431c
1 changed files with 5 additions and 0 deletions
  1. 5 0
      net/rxrpc/output.c

+ 5 - 0
net/rxrpc/output.c

@@ -137,6 +137,11 @@ int rxrpc_send_call_packet(struct rxrpc_call *call, u8 type)
 	switch (type) {
 	switch (type) {
 	case RXRPC_PACKET_TYPE_ACK:
 	case RXRPC_PACKET_TYPE_ACK:
 		spin_lock_bh(&call->lock);
 		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);
 		n = rxrpc_fill_out_ack(call, pkt);
 		call->ackr_reason = 0;
 		call->ackr_reason = 0;