From: Roelof duToit Date: Thu, 13 Jul 2017 17:07:26 +0000 (-0400) Subject: Retry SSL_read on ERROR_WANT_READ. X-Git-Tag: OpenSSL_1_1_1-pre1~1046 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=f32bf051cf1c376216bf4fec905fafebeb6ec2dc;p=oweals%2Fopenssl.git Retry SSL_read on ERROR_WANT_READ. This resolves the retry issue in general, but also the specific case where a TLS 1.3 server sends a post-handshake NewSessionTicket message prior to appdata. Reviewed-by: Tim Hudson Reviewed-by: Bernd Edlinger Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/3925) --- diff --git a/apps/s_time.c b/apps/s_time.c index b10c7e1da7..6976c3ce9c 100644 --- a/apps/s_time.c +++ b/apps/s_time.c @@ -240,8 +240,8 @@ int s_time_main(int argc, char **argv) www_path); if (buf_len <= 0 || SSL_write(scon, buf, buf_len) <= 0) goto end; - while ((i = SSL_read(scon, buf, sizeof(buf))) > 0) - bytes_read += i; + while ((i = SSL_read(scon, buf, sizeof(buf))) > 0 || SSL_get_error(scon, i) == SSL_ERROR_WANT_READ) + if (i > 0) bytes_read += i; } #ifdef NO_SHUTDOWN SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); @@ -297,7 +297,7 @@ int s_time_main(int argc, char **argv) buf_len = BIO_snprintf(buf, sizeof(buf), fmt_http_get_cmd, www_path); if (buf_len <= 0 || SSL_write(scon, buf, buf_len) <= 0) goto end; - while (SSL_read(scon, buf, sizeof(buf)) > 0) + while ((i = SSL_read(scon, buf, sizeof(buf))) > 0 || SSL_get_error(scon, i) == SSL_ERROR_WANT_READ) continue; } #ifdef NO_SHUTDOWN @@ -328,8 +328,8 @@ int s_time_main(int argc, char **argv) www_path); if (buf_len <= 0 || SSL_write(scon, buf, buf_len) <= 0) goto end; - while ((i = SSL_read(scon, buf, sizeof(buf))) > 0) - bytes_read += i; + while ((i = SSL_read(scon, buf, sizeof(buf))) > 0 || SSL_get_error(scon, i) == SSL_ERROR_WANT_READ) + if (i > 0) bytes_read += i; } #ifdef NO_SHUTDOWN SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);