diff options
Diffstat (limited to '')
| -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) { |
