From b26e80f18a14ce4fb1ccf6f7cdf8b924787dd0e1 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Tue, 6 Feb 2024 23:33:24 +0100 Subject: [PATCH] sock: Add handling for want read/write --- src/lib/sock.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) 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;