diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
| -rw-r--r-- | net/ipv4/tcp_input.c | 11 | 
1 files changed, 6 insertions, 5 deletions
| diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 5a3ad09e2786..174d4376baa5 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -1179,13 +1179,14 @@ static int tcp_match_skb_to_sack(struct sock *sk, struct sk_buff *skb,  		 */  		if (pkt_len > mss) {  			unsigned int new_len = (pkt_len / mss) * mss; -			if (!in_sack && new_len < pkt_len) { +			if (!in_sack && new_len < pkt_len)  				new_len += mss; -				if (new_len >= skb->len) -					return 0; -			}  			pkt_len = new_len;  		} + +		if (pkt_len >= skb->len && !in_sack) +			return 0; +  		err = tcp_fragment(sk, skb, pkt_len, mss, GFP_ATOMIC);  		if (err < 0)  			return err; @@ -3189,7 +3190,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,  			int delta;  			/* Non-retransmitted hole got filled? That's reordering */ -			if (reord < prior_fackets) +			if (reord < prior_fackets && reord <= tp->fackets_out)  				tcp_update_reordering(sk, tp->fackets_out - reord, 0);  			delta = tcp_is_fack(tp) ? pkts_acked : |