X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=apps%2Fs_client.c;h=aa21ef6f41380c14c9d57c06a4d50e97aa774466;hp=b0b66b3fec61b33672fb61abbd85f4f1fe47ac77;hb=a3ef2c16792ccbf65ef9861e0df6e7c277bcf770;hpb=7315ce80de2f48503dfc5d160299baef123b71d7;ds=sidebyside diff --git a/apps/s_client.c b/apps/s_client.c index b0b66b3fec..aa21ef6f41 100644 --- a/apps/s_client.c +++ b/apps/s_client.c @@ -818,6 +818,7 @@ int s_client_main(int argc, char **argv) int socket_family = AF_UNSPEC, socket_type = SOCK_STREAM; int starttls_proto = PROTO_OFF, crl_format = FORMAT_PEM, crl_download = 0; int write_tty, read_tty, write_ssl, read_ssl, tty_on, ssl_pending; + int at_eof = 0; int read_buf_len = 0; int fallback_scsv = 0; long randamt = 0; @@ -2123,7 +2124,12 @@ int s_client_main(int argc, char **argv) if (!ssl_pending) { #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) if (tty_on) { - if (read_tty) + /* + * Note that select() returns when read _would not block_, + * and EOF satisfies that. To avoid a CPU-hogging loop, + * set the flag so we exit. + */ + if (read_tty && !at_eof) openssl_fdset(fileno(stdin), &readfds); if (write_tty) openssl_fdset(fileno(stdout), &writefds); @@ -2369,6 +2375,9 @@ int s_client_main(int argc, char **argv) } else i = raw_read_stdin(cbuf, BUFSIZZ); + if (i == 0) + at_eof = 1; + if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q' && cmdletters))) { BIO_printf(bio_err, "DONE\n"); ret = 0;