summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorJohn Denker <ssx@av8n.com>2016-06-10 14:46:07 -0400
committerRich Salz <rsalz@openssl.org>2016-06-12 08:52:40 -0400
commita3ef2c16792ccbf65ef9861e0df6e7c277bcf770 (patch)
treeaa0f338bcfe82a7ac1b762317f9e5892a0b9d292 /apps
parent7315ce80de2f48503dfc5d160299baef123b71d7 (diff)
RT2759: Don't read TTY when already at EOF.
Reviewed-by: Andy Polyakov <appro@openssl.org>
Diffstat (limited to 'apps')
-rw-r--r--apps/s_client.c11
1 files changed, 10 insertions, 1 deletions
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;