| From foo@baz Wed 29 Jul 2020 12:42:55 PM CEST |
| From: David Howells <dhowells@redhat.com> |
| Date: Mon, 20 Jul 2020 12:41:46 +0100 |
| Subject: rxrpc: Fix sendmsg() returning EPIPE due to recvmsg() returning ENODATA |
| |
| From: David Howells <dhowells@redhat.com> |
| |
| [ Upstream commit 639f181f0ee20d3249dbc55f740f0167267180f0 ] |
| |
| rxrpc_sendmsg() returns EPIPE if there's an outstanding error, such as if |
| rxrpc_recvmsg() indicating ENODATA if there's nothing for it to read. |
| |
| Change rxrpc_recvmsg() to return EAGAIN instead if there's nothing to read |
| as this particular error doesn't get stored in ->sk_err by the networking |
| core. |
| |
| Also change rxrpc_sendmsg() so that it doesn't fail with delayed receive |
| errors (there's no way for it to report which call, if any, the error was |
| caused by). |
| |
| Fixes: 17926a79320a ("[AF_RXRPC]: Provide secure RxRPC sockets for use by userspace and kernel both") |
| Signed-off-by: David Howells <dhowells@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/rxrpc/recvmsg.c | 2 +- |
| net/rxrpc/sendmsg.c | 2 +- |
| 2 files changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/net/rxrpc/recvmsg.c |
| +++ b/net/rxrpc/recvmsg.c |
| @@ -439,7 +439,7 @@ try_again: |
| list_empty(&rx->recvmsg_q) && |
| rx->sk.sk_state != RXRPC_SERVER_LISTENING) { |
| release_sock(&rx->sk); |
| - return -ENODATA; |
| + return -EAGAIN; |
| } |
| |
| if (list_empty(&rx->recvmsg_q)) { |
| --- a/net/rxrpc/sendmsg.c |
| +++ b/net/rxrpc/sendmsg.c |
| @@ -191,7 +191,7 @@ static int rxrpc_send_data(struct rxrpc_ |
| /* this should be in poll */ |
| sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk); |
| |
| - if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) |
| + if (sk->sk_shutdown & SEND_SHUTDOWN) |
| return -EPIPE; |
| |
| more = msg->msg_flags & MSG_MORE; |