mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
tcp: exclude old ACKs from tcp fast path
Exclude old ACKs before SND.UNA from the tcp fast path as well as ACKs after SND.NXT. Such ACKs will fall through to the slow path, where tcp_ack() performs the appropriate validation and challenge ACK handling according to RFC5961 and Commit3d501dd326("tcp: do not accept ACK of bytes we never sent"). This prevents old ACKs from being accepted or modifying connection state as part of the fast path before appropriate ACK validation is applied. In particular, this prevents payload carried by a segment with an excessively old ACK from advancing RCV.NXT before the ACK is rejected. Fixes:31770e34e4("tcp: Revert "tcp: remove header prediction"") Reported-by: Amit Klein <amit.klein@mail.huji.ac.il> Reported-by: Tamir Shahar <tamir.shahar1@mail.huji.ac.il> Reported-by: Inbal Schussheim <inbal.lipshtat@mail.huji.ac.il> Suggested-by: Eric Dumazet <edumazet@google.com> Cc: stable@vger.kernel.org Signed-off-by: Inbal Schussheim <inbal.lipshtat@mail.huji.ac.il> Reviewed-by: Eric Dumazet <edumazet@google.com> Link: https://patch.msgid.link/20260914090408.1435080-2-inbal.lipshtat@mail.huji.ac.il Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
d798162eb3
commit
f81e6c3fb0
|
|
@ -6490,6 +6490,7 @@ static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
|
|||
* or pure receivers (this means either the sequence number or the ack
|
||||
* value must stay constant)
|
||||
* - Unexpected TCP option.
|
||||
* - ACK sequence number is outside [SND.UNA, SND.NXT].
|
||||
*
|
||||
* When these conditions are not satisfied it drops into a standard
|
||||
* receive procedure patterned after RFC793 to handle all cases.
|
||||
|
|
@ -6539,7 +6540,7 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb)
|
|||
|
||||
if ((tcp_flag_word(th) & TCP_HP_BITS) == tp->pred_flags &&
|
||||
TCP_SKB_CB(skb)->seq == tp->rcv_nxt &&
|
||||
!after(TCP_SKB_CB(skb)->ack_seq, tp->snd_nxt)) {
|
||||
between(TCP_SKB_CB(skb)->ack_seq, tp->snd_una, tp->snd_nxt)) {
|
||||
int tcp_header_len = tp->tcp_header_len;
|
||||
s32 delta = 0;
|
||||
int flag = 0;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user