diff --git a/src/lib/sock.c b/src/lib/sock.c index cffe107..4465c2f 100644 --- a/src/lib/sock.c +++ b/src/lib/sock.c @@ -211,8 +211,15 @@ long sock_send(sock *s, void *buf, unsigned long len, int flags) { long ret; if (s->enc) { - ret = SSL_write(s->ssl, buf, (int) len); - if (ret <= 0) sock_error(s, (int) ret); + while (1) { + ret = SSL_write(s->ssl, buf, (int) len); + if (ret <= 0) { + sock_error(s, (int) ret); + if (error_get_ssl() == SSL_ERROR_WANT_WRITE) + continue; + } + break; + } } else if (s->pipe) { if (flags & ~MSG_MORE) { errno = EINVAL; @@ -255,8 +262,15 @@ long sock_recv(sock *s, void *buf, unsigned long len, int flags) { long ret; if (s->enc) { int (*func)(SSL *, void *, int) = (flags & MSG_PEEK) ? SSL_peek : SSL_read; - ret = func(s->ssl, buf, (int) len); - if (ret <= 0) sock_error(s, (int) ret); + while (1) { + ret = func(s->ssl, buf, (int) len); + if (ret <= 0) { + sock_error(s, (int) ret); + if (error_get_ssl() == SSL_ERROR_WANT_READ) + continue; + } + break; + } } else if (s->pipe) { if (flags & ~MSG_WAITALL) { errno = EINVAL;