From 0870c8ea93929d4e123d31805707a978bc39fdf0 Mon Sep 17 00:00:00 2001 From: Bernd Edlinger Date: Wed, 21 Mar 2018 16:23:57 +0100 Subject: [PATCH] Cleanup the s_time command. Various code-cleanups. Use SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY) insead of handling SSL_ERROR_WANT_READ everywhere. Turn off the linger option on connected sockets to avoid failure. Add BIO_set_conn_mode(conn, BIO_SOCK_NODELAY) to improve thruput. Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/3952) --- apps/s_time.c | 82 +++++++++++++-------------------------------------- 1 file changed, 21 insertions(+), 61 deletions(-) diff --git a/apps/s_time.c b/apps/s_time.c index 0d3543e982..5688f4f5fb 100644 --- a/apps/s_time.c +++ b/apps/s_time.c @@ -7,8 +7,6 @@ * https://www.openssl.org/source/license.html */ -#define NO_SHUTDOWN - #include #include #include @@ -24,26 +22,13 @@ #include #include "s_apps.h" #include +#include #if !defined(OPENSSL_SYS_MSDOS) # include OPENSSL_UNISTD #endif -#undef ioctl -#define ioctl ioctlsocket - #define SSL_CONNECT_NAME "localhost:4433" -/* no default cert. */ -/* - * #define TEST_CERT "client.pem" - */ - -#undef min -#undef max -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#define max(a,b) (((a) > (b)) ? (a) : (b)) - -#undef SECONDS #define SECONDS 30 #define SECONDSSTR "30" @@ -206,6 +191,7 @@ int s_time_main(int argc, char **argv) if ((ctx = SSL_CTX_new(meth)) == NULL) goto end; + SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY); SSL_CTX_set_quiet_shutdown(ctx, 1); if (SSL_CTX_set_max_proto_version(ctx, max_version) == 0) goto end; @@ -244,16 +230,10 @@ 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 || - SSL_get_error(scon, i) == SSL_ERROR_WANT_READ || - SSL_get_error(scon, i) == SSL_ERROR_WANT_WRITE) - if (i > 0) bytes_read += i; + while ((i = SSL_read(scon, buf, sizeof(buf))) > 0) + bytes_read += i; } -#ifdef NO_SHUTDOWN SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); -#else - SSL_shutdown(scon); -#endif BIO_closesocket(SSL_get_fd(scon)); nConn += 1; @@ -303,16 +283,10 @@ 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 ((i = SSL_read(scon, buf, sizeof(buf))) > 0 || - SSL_get_error(scon, i) == SSL_ERROR_WANT_READ || - SSL_get_error(scon, i) == SSL_ERROR_WANT_WRITE) + while ((i = SSL_read(scon, buf, sizeof(buf))) > 0) continue; } -#ifdef NO_SHUTDOWN SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); -#else - SSL_shutdown(scon); -#endif BIO_closesocket(SSL_get_fd(scon)); nConn = 0; @@ -336,16 +310,10 @@ 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 || - SSL_get_error(scon, i) == SSL_ERROR_WANT_READ || - SSL_get_error(scon, i) == SSL_ERROR_WANT_WRITE) - if (i > 0) bytes_read += i; + while ((i = SSL_read(scon, buf, sizeof(buf))) > 0) + bytes_read += i; } -#ifdef NO_SHUTDOWN SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); -#else - SSL_shutdown(scon); -#endif BIO_closesocket(SSL_get_fd(scon)); nConn += 1; @@ -387,13 +355,13 @@ static SSL *doConnection(SSL *scon, const char *host, SSL_CTX *ctx) { BIO *conn; SSL *serverCon; - int width, i; - fd_set readfds; + int i; if ((conn = BIO_new(BIO_s_connect())) == NULL) return NULL; BIO_set_conn_hostname(conn, host); + BIO_set_conn_mode(conn, BIO_SOCK_NODELAY); if (scon == NULL) serverCon = SSL_new(ctx); @@ -405,26 +373,7 @@ static SSL *doConnection(SSL *scon, const char *host, SSL_CTX *ctx) SSL_set_bio(serverCon, conn, conn); /* ok, lets connect */ - for (;;) { - i = SSL_connect(serverCon); - if (BIO_sock_should_retry(i)) { - BIO_printf(bio_err, "DELAY\n"); - - i = SSL_get_fd(serverCon); - width = i + 1; - FD_ZERO(&readfds); - openssl_fdset(i, &readfds); - /* - * Note: under VMS with SOCKETSHR the 2nd parameter is currently - * of type (int *) whereas under other systems it is (void *) if - * you don't have a cast it will choke the compiler: if you do - * have a cast then you can either go for (int *) or (void *). - */ - select(width, (void *)&readfds, NULL, NULL, NULL); - continue; - } - break; - } + i = SSL_connect(serverCon); if (i <= 0) { BIO_printf(bio_err, "ERROR\n"); if (verify_args.error != X509_V_OK) @@ -437,6 +386,17 @@ static SSL *doConnection(SSL *scon, const char *host, SSL_CTX *ctx) return NULL; } +#if defined(SOL_SOCKET) && defined(SO_LINGER) + { + struct linger no_linger; + + no_linger.l_onoff = 1; + no_linger.l_linger = 0; + (void) setsockopt(SSL_get_fd(serverCon), SOL_SOCKET, SO_LINGER, + (char*)&no_linger, sizeof(no_linger)); + } +#endif + return serverCon; } #endif /* OPENSSL_NO_SOCK */ -- 2.25.1