diff options
Diffstat (limited to 'src/usr.bin/openssl/s_server.c')
-rw-r--r-- | src/usr.bin/openssl/s_server.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/src/usr.bin/openssl/s_server.c b/src/usr.bin/openssl/s_server.c index 1e6f85f9fb..b3cdb30a61 100644 --- a/src/usr.bin/openssl/s_server.c +++ b/src/usr.bin/openssl/s_server.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: s_server.c,v 1.6 2014/11/06 14:50:12 jsing Exp $ */ | 1 | /* $OpenBSD: s_server.c,v 1.7 2014/12/02 19:44:49 deraadt Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -148,7 +148,6 @@ | |||
148 | 148 | ||
149 | #include <sys/types.h> | 149 | #include <sys/types.h> |
150 | #include <sys/ioctl.h> | 150 | #include <sys/ioctl.h> |
151 | #include <sys/select.h> | ||
152 | #include <sys/socket.h> | 151 | #include <sys/socket.h> |
153 | 152 | ||
154 | #include <assert.h> | 153 | #include <assert.h> |
@@ -158,6 +157,7 @@ | |||
158 | #include <limits.h> | 157 | #include <limits.h> |
159 | #include <string.h> | 158 | #include <string.h> |
160 | #include <unistd.h> | 159 | #include <unistd.h> |
160 | #include <poll.h> | ||
161 | 161 | ||
162 | #include "apps.h" | 162 | #include "apps.h" |
163 | 163 | ||
@@ -1279,14 +1279,12 @@ static int | |||
1279 | sv_body(char *hostname, int s, unsigned char *context) | 1279 | sv_body(char *hostname, int s, unsigned char *context) |
1280 | { | 1280 | { |
1281 | char *buf = NULL; | 1281 | char *buf = NULL; |
1282 | fd_set readfds; | 1282 | int ret = 1; |
1283 | int ret = 1, width; | ||
1284 | int k, i; | 1283 | int k, i; |
1285 | unsigned long l; | 1284 | unsigned long l; |
1286 | SSL *con = NULL; | 1285 | SSL *con = NULL; |
1287 | BIO *sbio; | 1286 | BIO *sbio; |
1288 | struct timeval timeout; | 1287 | struct timeval timeout; |
1289 | struct timeval *timeoutp; | ||
1290 | 1288 | ||
1291 | if ((buf = malloc(bufsize)) == NULL) { | 1289 | if ((buf = malloc(bufsize)) == NULL) { |
1292 | BIO_printf(bio_err, "out of memory\n"); | 1290 | BIO_printf(bio_err, "out of memory\n"); |
@@ -1366,35 +1364,45 @@ sv_body(char *hostname, int s, unsigned char *context) | |||
1366 | SSL_set_tlsext_debug_arg(con, bio_s_out); | 1364 | SSL_set_tlsext_debug_arg(con, bio_s_out); |
1367 | } | 1365 | } |
1368 | 1366 | ||
1369 | width = s + 1; | ||
1370 | for (;;) { | 1367 | for (;;) { |
1371 | int read_from_terminal; | 1368 | int read_from_terminal; |
1372 | int read_from_sslcon; | 1369 | int read_from_sslcon; |
1370 | struct pollfd pfd[2]; | ||
1371 | int ptimeout; | ||
1373 | 1372 | ||
1374 | read_from_terminal = 0; | 1373 | read_from_terminal = 0; |
1375 | read_from_sslcon = SSL_pending(con); | 1374 | read_from_sslcon = SSL_pending(con); |
1376 | 1375 | ||
1377 | if (!read_from_sslcon) { | 1376 | if (!read_from_sslcon) { |
1378 | FD_ZERO(&readfds); | 1377 | pfd[0].fd = fileno(stdin); |
1379 | FD_SET(fileno(stdin), &readfds); | 1378 | pfd[0].events = POLLIN; |
1380 | FD_SET(s, &readfds); | 1379 | pfd[1].fd = s; |
1380 | pfd[1].events = POLLIN; | ||
1381 | |||
1381 | if ((SSL_version(con) == DTLS1_VERSION) && | 1382 | if ((SSL_version(con) == DTLS1_VERSION) && |
1382 | DTLSv1_get_timeout(con, &timeout)) | 1383 | DTLSv1_get_timeout(con, &timeout)) |
1383 | timeoutp = &timeout; | 1384 | ptimeout = timeout.tv_sec * 1000 + |
1385 | timeout.tv_usec / 1000; | ||
1384 | else | 1386 | else |
1385 | timeoutp = NULL; | 1387 | ptimeout = -1; |
1386 | 1388 | ||
1387 | i = select(width, &readfds, NULL, NULL, timeoutp); | 1389 | i = poll(pfd, 2, ptimeout); |
1388 | 1390 | ||
1389 | if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0) { | 1391 | if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0) { |
1390 | BIO_printf(bio_err, "TIMEOUT occured\n"); | 1392 | BIO_printf(bio_err, "TIMEOUT occured\n"); |
1391 | } | 1393 | } |
1392 | if (i <= 0) | 1394 | if (i <= 0) |
1393 | continue; | 1395 | continue; |
1394 | if (FD_ISSET(fileno(stdin), &readfds)) | 1396 | if (pfd[0].revents) { |
1397 | if ((pfd[0].revents & (POLLERR|POLLNVAL))) | ||
1398 | continue; | ||
1395 | read_from_terminal = 1; | 1399 | read_from_terminal = 1; |
1396 | if (FD_ISSET(s, &readfds)) | 1400 | } |
1401 | if (pfd[1].revents) { | ||
1402 | if ((pfd[1].revents & (POLLERR|POLLNVAL))) | ||
1403 | continue; | ||
1397 | read_from_sslcon = 1; | 1404 | read_from_sslcon = 1; |
1405 | } | ||
1398 | } | 1406 | } |
1399 | if (read_from_terminal) { | 1407 | if (read_from_terminal) { |
1400 | if (s_crlf) { | 1408 | if (s_crlf) { |