mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-10 07:50:04 +00:00
rxrpc: Don't treat call aborts as conn aborts
If a call-level abort is received for the previous call to complete on a connection channel, then that abort is queued for the connection processor to handle. Unfortunately, the connection processor then assumes without checking that the abort is connection-level (ie. callNumber is 0) and distributes it over all active calls on that connection, thereby incorrectly aborting them. Fix this by discarding aborts aimed at a completed call. Further, discard all packets aimed at a call that's complete if there's currently an active call on a channel, since the DATA packets associated with the new call automatically terminate the old call. Fixes: 18bfeba50dfd ("rxrpc: Perform terminal call ACK/ABORT retransmission from conn processor") Reported-by: Marc Dionne <marc.dionne@auristor.com> Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
parent
03877bf6a3
commit
57b0c9d49b
@ -1242,16 +1242,19 @@ void rxrpc_data_ready(struct sock *udp_sk)
|
||||
goto discard_unlock;
|
||||
|
||||
if (sp->hdr.callNumber == chan->last_call) {
|
||||
/* For the previous service call, if completed successfully, we
|
||||
* discard all further packets.
|
||||
*/
|
||||
if (rxrpc_conn_is_service(conn) &&
|
||||
(chan->last_type == RXRPC_PACKET_TYPE_ACK ||
|
||||
sp->hdr.type == RXRPC_PACKET_TYPE_ABORT))
|
||||
if (chan->call ||
|
||||
sp->hdr.type == RXRPC_PACKET_TYPE_ABORT)
|
||||
goto discard_unlock;
|
||||
|
||||
/* But otherwise we need to retransmit the final packet from
|
||||
* data cached in the connection record.
|
||||
/* For the previous service call, if completed
|
||||
* successfully, we discard all further packets.
|
||||
*/
|
||||
if (rxrpc_conn_is_service(conn) &&
|
||||
chan->last_type == RXRPC_PACKET_TYPE_ACK)
|
||||
goto discard_unlock;
|
||||
|
||||
/* But otherwise we need to retransmit the final packet
|
||||
* from data cached in the connection record.
|
||||
*/
|
||||
rxrpc_post_packet_to_conn(conn, skb);
|
||||
goto out_unlock;
|
||||
|
Loading…
x
Reference in New Issue
Block a user