diff --git a/src/stream/read.c b/src/stream/read.c index 9b697f5..2db19ae 100644 --- a/src/stream/read.c +++ b/src/stream/read.c @@ -68,8 +68,25 @@ streamRead(Stream this, void * buf, size_t count) if (0 >= done) { switch (SSL_get_error((this->handle).ssl, done)) { + case SSL_ERROR_SYSCALL: + { + switch (errno) { + case EINTR: + case ENOBUFS: + case ENOMEM: + done = 0; + break; + case (EAGAIN|EWOULDBLOCK): + done = -1; + break; + default: + done = -2; + break; + } + } + break; + case SSL_ERROR_SSL: - case SSL_ERROR_SYSCALL: { unsigned long err; @@ -83,6 +100,7 @@ streamRead(Stream this, void * buf, size_t count) // DROP THROUGH case SSL_ERROR_ZERO_RETURN: + default: done = -2; break; }