rxrpc: Fix insufficient receive notification generation
authorDavid Howells <dhowells@redhat.com>
Thu, 30 Jan 2020 21:50:36 +0000 (21:50 +0000)
committerDavid Howells <dhowells@redhat.com>
Thu, 30 Jan 2020 21:50:41 +0000 (21:50 +0000)
In rxrpc_input_data(), rxrpc_notify_socket() is called if the base sequence
number of the packet is immediately following the hard-ack point at the end
of the function.  However, this isn't sufficient, since the recvmsg side
may have been advancing the window and then overrun the position in which
we're adding - at which point rx_hard_ack >= seq0 and no notification is
generated.

Fix this by always generating a notification at the end of the input
function.

Without this, a long call may stall, possibly indefinitely.

Fixes: 248f219cb8bc ("rxrpc: Rewrite the data and ack handling code")
Signed-off-by: David Howells <dhowells@redhat.com>
net/rxrpc/input.c

index 96d54e5bf7bcaae3bd553ae4d57ef60e9d5fa393..ef10fbf71b1555b173f48210d2e763bb00b3ccaa 100644 (file)
@@ -599,10 +599,8 @@ ack:
                                  false, true,
                                  rxrpc_propose_ack_input_data);
 
-       if (seq0 == READ_ONCE(call->rx_hard_ack) + 1) {
-               trace_rxrpc_notify_socket(call->debug_id, serial);
-               rxrpc_notify_socket(call);
-       }
+       trace_rxrpc_notify_socket(call->debug_id, serial);
+       rxrpc_notify_socket(call);
 
 unlock:
        spin_unlock(&call->input_lock);