This fixes a hole where rack could end up

sending an invalid segment into the reassembly
queue. This would happen if you enabled the
data after close option.

Sponsored by:	Netflix
Differential Revision: https://reviews.freebsd.org/D16453
This commit is contained in:
Randall Stewart 2018-07-30 10:23:29 +00:00
parent 3810edcf6b
commit 4ad5b7a0ac

View File

@ -4657,7 +4657,6 @@ rack_process_data(struct mbuf *m, struct tcphdr *th, struct socket *so,
rack = (struct tcp_rack *)tp->t_fb_ptr; rack = (struct tcp_rack *)tp->t_fb_ptr;
INP_WLOCK_ASSERT(tp->t_inpcb); INP_WLOCK_ASSERT(tp->t_inpcb);
nsegs = max(1, m->m_pkthdr.lro_nsegs); nsegs = max(1, m->m_pkthdr.lro_nsegs);
if ((thflags & TH_ACK) && if ((thflags & TH_ACK) &&
(SEQ_LT(tp->snd_wl1, th->th_seq) || (SEQ_LT(tp->snd_wl1, th->th_seq) ||
@ -4687,6 +4686,10 @@ rack_process_data(struct mbuf *m, struct tcphdr *th, struct socket *so,
/* Make sure we output to start the timer */ /* Make sure we output to start the timer */
rack->r_wanted_output++; rack->r_wanted_output++;
} }
if (tp->t_flags2 & TF2_DROP_AF_DATA) {
m_freem(m);
return (0);
}
/* /*
* Process segments with URG. * Process segments with URG.
*/ */