]> git.hungrycats.org Git - linux/commitdiff
TCP: do not return -EINTR, when data are available for read()
authorAlexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Mon, 20 Oct 2003 15:29:51 +0000 (08:29 -0700)
committerDavid S. Miller <davem@nuts.ninka.net>
Mon, 20 Oct 2003 15:29:51 +0000 (08:29 -0700)
net/ipv4/tcp.c

index 6f3331d6b9f1cbc11a853c1fd4055b6110061b0f..1da4fa8de355996a0a0381ee7c2157029001fd7d 100644 (file)
@@ -1540,17 +1540,6 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                if (copied && tp->urg_data && tp->urg_seq == *seq)
                        break;
 
-               /* We need to check signals first, to get correct SIGURG
-                * handling. FIXME: Need to check this doesn't impact 1003.1g
-                * and move it down to the bottom of the loop
-                */
-               if (signal_pending(current)) {
-                       if (copied)
-                               break;
-                       copied = timeo ? sock_intr_errno(timeo) : -EAGAIN;
-                       break;
-               }
-
                /* Next get a buffer. */
 
                skb = skb_peek(&sk->sk_receive_queue);
@@ -1587,6 +1576,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                            sk->sk_state == TCP_CLOSE ||
                            (sk->sk_shutdown & RCV_SHUTDOWN) ||
                            !timeo ||
+                           signal_pending(current) ||
                            (flags & MSG_PEEK))
                                break;
                } else {
@@ -1616,6 +1606,11 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                                copied = -EAGAIN;
                                break;
                        }
+
+                       if (signal_pending(current)) {
+                               copied = sock_intr_errno(timeo);
+                               break;
+                       }
                }
 
                cleanup_rbuf(sk, copied);