Skip to content

Commit

Permalink
rxrpc: Don't treat call aborts as conn aborts
Browse files Browse the repository at this point in the history
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: 18bfeba ("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>
  • Loading branch information
David Howells committed Mar 30, 2018
1 parent 03877bf commit 57b0c9d
Showing 1 changed file with 9 additions and 6 deletions.
15 changes: 9 additions & 6 deletions net/rxrpc/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 (chan->call ||
sp->hdr.type == RXRPC_PACKET_TYPE_ABORT)
goto discard_unlock;

/* 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))
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.
/* 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;
Expand Down

0 comments on commit 57b0c9d

Please sign in to comment.