tcp: avoid infinite loop in tcp_splice_read()
[pandora-kernel.git] / net / ipv4 / tcp.c
index 32c9e83..80a9a97 100644 (file)
@@ -659,6 +659,12 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos,
                                ret = -EAGAIN;
                                break;
                        }
+                       /* if __tcp_splice_read() got nothing while we have
+                        * an skb in receive queue, we do not want to loop.
+                        * This might happen with URG data.
+                        */
+                       if (!skb_queue_empty(&sk->sk_receive_queue))
+                               break;
                        sk_wait_data(sk, &timeo);
                        if (signal_pending(current)) {
                                ret = sock_intr_errno(timeo);
@@ -738,9 +744,7 @@ static unsigned int tcp_xmit_size_goal(struct sock *sk, u32 mss_now,
                           old_size_goal + mss_now > xmit_size_goal)) {
                        xmit_size_goal = old_size_goal;
                } else {
-                       tp->xmit_size_goal_segs =
-                               min_t(u16, xmit_size_goal / mss_now,
-                                     sk->sk_gso_max_segs);
+                       tp->xmit_size_goal_segs = xmit_size_goal / mss_now;
                        xmit_size_goal = tp->xmit_size_goal_segs * mss_now;
                }
        }