summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilind Changire <mchangir@redhat.com>2018-08-25 18:45:34 +0530
committerShyamsundar Ranganathan <srangana@redhat.com>2018-09-21 13:09:41 +0000
commited59d4a8c4eafb7ff7709d0bf12c467a0bc35698 (patch)
tree4ad4c8c6d1c540be3f5aa8dd2a90e6acf69e592b
parent1dc54679178d03626ec06b9e58a4d24732c1de13 (diff)
rpc: handle EAGAIN when SSL_ERROR_SYSCALL is returned
Problem: A return value of ENODATA was forcibly returned in the case where SSL_get_error(r) returned SSL_ERROR_SYSCALL. Sometimes SSL_ERROR_SYSCALL is a transient error which is identified by setting errno to EAGAIN. EAGAIN is not a fatal error and indicates that the syscall needs to be retried. Solution: Bubble up the errno in case SSL_get_error(r) returns SSL_ERROR_SYSCALL and let the upper layers handle it appropriately. fixes: bz#1601356 Change-Id: I76eff278378930ee79abbf9fa267a7e77356eed6 Signed-off-by: Milind Changire <mchangir@redhat.com>
-rw-r--r--rpc/rpc-transport/socket/src/socket.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c
index 34bdbdea9d0..619f6fffd04 100644
--- a/rpc/rpc-transport/socket/src/socket.c
+++ b/rpc/rpc-transport/socket/src/socket.c
@@ -210,6 +210,7 @@ ssl_do (rpc_transport_t *this, void *buf, size_t len, SSL_trinary_func *func)
int r = (-1);
struct pollfd pfd = {-1, };
socket_private_t *priv = NULL;
+ int myerrno = -1;
GF_VALIDATE_OR_GOTO(this->name, this->private, out);
priv = this->private;
@@ -276,10 +277,16 @@ ssl_do (rpc_transport_t *this, void *buf, size_t len, SSL_trinary_func *func)
}
break;
case SSL_ERROR_SYSCALL:
+ myerrno = errno;
/* This is what we get when remote disconnects. */
gf_log(this->name, GF_LOG_DEBUG,
- "syscall error (probably remote disconnect)");
- errno = ENODATA;
+ "syscall error (probably remote disconnect)"
+ " errno:%d(%s)", errno, strerror(errno));
+ /* sometimes, errno is set to EAGAIN in this case
+ * so let the upper layers do what they need to do
+ * with it
+ */
+ errno = myerrno;
goto out;
default:
errno = EIO;