diff options
author | Erik Hugne <erik.hugne@ericsson.com> | 2015-03-09 05:43:42 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-09 15:42:19 -0400 |
commit | 143fe22f50a8be855bba77b5b2dc9dd1a5982b1c (patch) | |
tree | ff4c064cb226d455ad2273770dec7432a58357ba /net/tipc/socket.c | |
parent | 57ad7a0a81f3e9e619540ce9e31d5bd724b59a6e (diff) |
tipc: fix inconsistent signal handling regression
Commit 9bbb4ecc6819 ("tipc: standardize recvmsg routine") changed
the sleep/wakeup behaviour for sockets entering recv() or accept().
In this process the order of reporting -EAGAIN/-EINTR was reversed.
This caused problems with wrong errno being reported back if the
timeout expires. The same problem happens if the socket is
nonblocking and recv()/accept() is called when the process have
pending signals. If there is no pending data read or connections to
accept, -EINTR will be returned instead of -EAGAIN.
Signed-off-by: Erik Hugne <erik.hugne@ericsson.com>
Reviewed-by: Ying Xue <ying.xue@windriver.com>
Reviewed-by: Jon Maloy <jon.maloy@ericsson.com>
Reported-by László Benedek <laszlo.benedek@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r-- | net/tipc/socket.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 95c514a1d7d9..934947f038b6 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -1318,12 +1318,12 @@ static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop) | |||
1318 | err = 0; | 1318 | err = 0; |
1319 | if (!skb_queue_empty(&sk->sk_receive_queue)) | 1319 | if (!skb_queue_empty(&sk->sk_receive_queue)) |
1320 | break; | 1320 | break; |
1321 | err = sock_intr_errno(timeo); | ||
1322 | if (signal_pending(current)) | ||
1323 | break; | ||
1324 | err = -EAGAIN; | 1321 | err = -EAGAIN; |
1325 | if (!timeo) | 1322 | if (!timeo) |
1326 | break; | 1323 | break; |
1324 | err = sock_intr_errno(timeo); | ||
1325 | if (signal_pending(current)) | ||
1326 | break; | ||
1327 | } | 1327 | } |
1328 | finish_wait(sk_sleep(sk), &wait); | 1328 | finish_wait(sk_sleep(sk), &wait); |
1329 | *timeop = timeo; | 1329 | *timeop = timeo; |
@@ -2026,12 +2026,12 @@ static int tipc_wait_for_accept(struct socket *sock, long timeo) | |||
2026 | err = -EINVAL; | 2026 | err = -EINVAL; |
2027 | if (sock->state != SS_LISTENING) | 2027 | if (sock->state != SS_LISTENING) |
2028 | break; | 2028 | break; |
2029 | err = sock_intr_errno(timeo); | ||
2030 | if (signal_pending(current)) | ||
2031 | break; | ||
2032 | err = -EAGAIN; | 2029 | err = -EAGAIN; |
2033 | if (!timeo) | 2030 | if (!timeo) |
2034 | break; | 2031 | break; |
2032 | err = sock_intr_errno(timeo); | ||
2033 | if (signal_pending(current)) | ||
2034 | break; | ||
2035 | } | 2035 | } |
2036 | finish_wait(sk_sleep(sk), &wait); | 2036 | finish_wait(sk_sleep(sk), &wait); |
2037 | return err; | 2037 | return err; |