fix panic when rescue retransmission and FIN overlap

PR:           254244
PR:           254309
Reviewed By:  #transport, hselasky, tuexen
MFC after:    3 days
Sponsored By: NetApp, Inc.
Differential Revision: https://reviews.freebsd.org/D29315
This commit is contained in:
Richard Scheffenegger 2021-03-17 16:44:29 +01:00
parent e5c6913a8d
commit e9f029831f

View File

@ -831,8 +831,18 @@ tcp_sack_partialack(struct tcpcb *tp, struct tcphdr *th)
(tp->snd_recover == tp->snd_max) &&
TAILQ_EMPTY(&tp->snd_holes) &&
(tp->sackhint.delivered_data > 0)) {
struct sackhole *hole;
hole = tcp_sackhole_insert(tp, SEQ_MAX(th->th_ack, tp->snd_max - maxseg), tp->snd_max, NULL);
/*
* Exclude FIN sequence space in
* the hole for the rescue retransmission,
* and also don't create a hole, if only
* the ACK for a FIN is outstanding.
*/
tcp_seq highdata = tp->snd_max;
if (tp->t_flags & TF_SENTFIN)
highdata--;
if (th->th_ack != highdata)
(void)tcp_sackhole_insert(tp, SEQ_MAX(th->th_ack,
highdata - maxseg), highdata, NULL);
}
(void) tp->t_fb->tfb_tcp_output(tp);
}