diff options
author | Milind Changire <mchangir@redhat.com> | 2018-08-25 18:45:34 +0530 |
---|---|---|
committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2018-09-21 13:09:41 +0000 |
commit | ed59d4a8c4eafb7ff7709d0bf12c467a0bc35698 (patch) | |
tree | 4ad4c8c6d1c540be3f5aa8dd2a90e6acf69e592b /rpc | |
parent | 1dc54679178d03626ec06b9e58a4d24732c1de13 (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>
Diffstat (limited to 'rpc')
-rw-r--r-- | rpc/rpc-transport/socket/src/socket.c | 11 |
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; |