aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/tcp_input.c28
1 files changed, 11 insertions, 17 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index ba34a23c1bfb..2bdb0da237e6 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -4481,26 +4481,20 @@ drop:
4481 __skb_queue_after(&tp->out_of_order_queue, skb1, skb); 4481 __skb_queue_after(&tp->out_of_order_queue, skb1, skb);
4482 4482
4483 /* And clean segments covered by new one as whole. */ 4483 /* And clean segments covered by new one as whole. */
4484 if (skb1 && !skb_queue_is_last(&tp->out_of_order_queue, skb1)) { 4484 while (!skb_queue_is_last(&tp->out_of_order_queue, skb)) {
4485 struct sk_buff *n; 4485 skb1 = skb_queue_next(&tp->out_of_order_queue, skb);
4486 4486
4487 skb1 = skb_queue_next(&tp->out_of_order_queue, skb1); 4487 if (!after(end_seq, TCP_SKB_CB(skb1)->seq))
4488 skb_queue_walk_from_safe(&tp->out_of_order_queue, 4488 break;
4489 skb1, n) { 4489 if (before(end_seq, TCP_SKB_CB(skb1)->end_seq)) {
4490 if (!after(end_seq, TCP_SKB_CB(skb1)->seq))
4491 break;
4492 if (before(end_seq,
4493 TCP_SKB_CB(skb1)->end_seq)) {
4494 tcp_dsack_extend(sk,
4495 TCP_SKB_CB(skb1)->seq,
4496 end_seq);
4497 break;
4498 }
4499 __skb_unlink(skb1, &tp->out_of_order_queue);
4500 tcp_dsack_extend(sk, TCP_SKB_CB(skb1)->seq, 4490 tcp_dsack_extend(sk, TCP_SKB_CB(skb1)->seq,
4501 TCP_SKB_CB(skb1)->end_seq); 4491 end_seq);
4502 __kfree_skb(skb1); 4492 break;
4503 } 4493 }
4494 __skb_unlink(skb1, &tp->out_of_order_queue);
4495 tcp_dsack_extend(sk, TCP_SKB_CB(skb1)->seq,
4496 TCP_SKB_CB(skb1)->end_seq);
4497 __kfree_skb(skb1);
4504 } 4498 }
4505 4499
4506add_sack: 4500add_sack: