From: Matt Caswell Date: Wed, 16 Sep 2015 21:54:54 +0000 (+0100) Subject: Fix s_server bug X-Git-Tag: OpenSSL_1_1_0-pre1~241 X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff_plain;h=64c07bd2d8fd162147a75ff885165bc31388bfa7 Fix s_server bug If an async event occurs during a renegotiation in SSL_read then s_server was looping around, detecting we were in init and calling init_ssl_connection instead of re-calling SSL_read. Reviewed-by: Rich Salz --- diff --git a/apps/s_server.c b/apps/s_server.c index 6b6035f0ba..14dd8a69db 100644 --- a/apps/s_server.c +++ b/apps/s_server.c @@ -2152,7 +2152,8 @@ static int sv_body(char *hostname, int s, int stype, unsigned char *context) int read_from_sslcon; read_from_terminal = 0; - read_from_sslcon = SSL_pending(con); + read_from_sslcon = SSL_pending(con) + || (async && SSL_waiting_for_async(con)); if (!read_from_sslcon) { FD_ZERO(&readfds); @@ -2348,7 +2349,13 @@ static int sv_body(char *hostname, int s, int stype, unsigned char *context) } } if (read_from_sslcon) { - if (!SSL_is_init_finished(con)) { + /* + * init_ssl_connection handles all async events itself so if we're + * waiting for async then we shouldn't go back into + * init_ssl_connection + */ + if ((!async || !SSL_waiting_for_async(con)) + && !SSL_is_init_finished(con)) { i = init_ssl_connection(con); if (i < 0) {