summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorderaadt <>2014-12-02 19:44:49 +0000
committerderaadt <>2014-12-02 19:44:49 +0000
commit6f5388d11ca7552025496dc1e465ad003e94f27e (patch)
tree6002058f0b7accfb8746cc5c4022e1bd924d4eea /src
parentc8143494d57c2153f018143c0a4c9f301036495c (diff)
downloadopenbsd-6f5388d11ca7552025496dc1e465ad003e94f27e.tar.gz
openbsd-6f5388d11ca7552025496dc1e465ad003e94f27e.tar.bz2
openbsd-6f5388d11ca7552025496dc1e465ad003e94f27e.zip
convert select() to poll(). This is one of the most complicated
conversions in the tree, because the original code is very rotten and fragile. Please test and report any failures. Assistance from millert, bcook, and jsing.
Diffstat (limited to 'src')
-rw-r--r--src/usr.bin/openssl/s_client.c67
-rw-r--r--src/usr.bin/openssl/s_server.c36
2 files changed, 63 insertions, 40 deletions
diff --git a/src/usr.bin/openssl/s_client.c b/src/usr.bin/openssl/s_client.c
index 988d799b97..94e24dacaa 100644
--- a/src/usr.bin/openssl/s_client.c
+++ b/src/usr.bin/openssl/s_client.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s_client.c,v 1.8 2014/11/18 20:54:28 krw Exp $ */ 1/* $OpenBSD: s_client.c,v 1.9 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 *
@@ -137,7 +137,6 @@
137 137
138#include <sys/types.h> 138#include <sys/types.h>
139#include <sys/ioctl.h> 139#include <sys/ioctl.h>
140#include <sys/select.h>
141#include <sys/socket.h> 140#include <sys/socket.h>
142 141
143#include <netinet/in.h> 142#include <netinet/in.h>
@@ -150,6 +149,7 @@
150#include <stdlib.h> 149#include <stdlib.h>
151#include <string.h> 150#include <string.h>
152#include <unistd.h> 151#include <unistd.h>
152#include <poll.h>
153 153
154#include "apps.h" 154#include "apps.h"
155 155
@@ -334,11 +334,10 @@ s_client_main(int argc, char **argv)
334{ 334{
335 unsigned int off = 0, clr = 0; 335 unsigned int off = 0, clr = 0;
336 SSL *con = NULL; 336 SSL *con = NULL;
337 int s, k, width, state = 0, af = AF_UNSPEC; 337 int s, k, state = 0, af = AF_UNSPEC;
338 char *cbuf = NULL, *sbuf = NULL, *mbuf = NULL; 338 char *cbuf = NULL, *sbuf = NULL, *mbuf = NULL;
339 int cbuf_len, cbuf_off; 339 int cbuf_len, cbuf_off;
340 int sbuf_len, sbuf_off; 340 int sbuf_len, sbuf_off;
341 fd_set readfds, writefds;
342 char *port = PORT_STR; 341 char *port = PORT_STR;
343 int full_log = 1; 342 int full_log = 1;
344 char *host = SSL_HOST_NAME; 343 char *host = SSL_HOST_NAME;
@@ -361,7 +360,7 @@ s_client_main(int argc, char **argv)
361 int socket_type = SOCK_STREAM; 360 int socket_type = SOCK_STREAM;
362 BIO *sbio; 361 BIO *sbio;
363 int mbuf_len = 0; 362 int mbuf_len = 0;
364 struct timeval timeout, *timeoutp; 363 struct timeval timeout;
365 const char *errstr = NULL; 364 const char *errstr = NULL;
366#ifndef OPENSSL_NO_ENGINE 365#ifndef OPENSSL_NO_ENGINE
367 char *engine_id = NULL; 366 char *engine_id = NULL;
@@ -874,8 +873,6 @@ re_start:
874 SSL_set_connect_state(con); 873 SSL_set_connect_state(con);
875 874
876 /* ok, lets connect */ 875 /* ok, lets connect */
877 width = SSL_get_fd(con) + 1;
878
879 read_tty = 1; 876 read_tty = 1;
880 write_tty = 0; 877 write_tty = 0;
881 tty_on = 0; 878 tty_on = 0;
@@ -991,14 +988,12 @@ re_start:
991 mbuf[0] = 0; 988 mbuf[0] = 0;
992 } 989 }
993 for (;;) { 990 for (;;) {
994 FD_ZERO(&readfds); 991 struct pollfd pfd[3]; /* stdin, stdout, socket */
995 FD_ZERO(&writefds); 992 int ptimeout = -1;
996 993
997 if ((SSL_version(con) == DTLS1_VERSION) && 994 if ((SSL_version(con) == DTLS1_VERSION) &&
998 DTLSv1_get_timeout(con, &timeout)) 995 DTLSv1_get_timeout(con, &timeout))
999 timeoutp = &timeout; 996 ptimeout = timeout.tv_sec * 1000 + timeout.tv_usec / 1000;
1000 else
1001 timeoutp = NULL;
1002 997
1003 if (SSL_in_init(con) && !SSL_total_renegotiations(con)) { 998 if (SSL_in_init(con) && !SSL_total_renegotiations(con)) {
1004 in_init = 1; 999 in_init = 1;
@@ -1038,24 +1033,31 @@ re_start:
1038 1033
1039 ssl_pending = read_ssl && SSL_pending(con); 1034 ssl_pending = read_ssl && SSL_pending(con);
1040 1035
1041 /* XXX should add tests for fd_set overflow */ 1036 pfd[0].fd = -1;
1042 1037 pfd[1].fd = -1;
1043 if (!ssl_pending) { 1038 if (!ssl_pending) {
1044 if (tty_on) { 1039 if (tty_on) {
1045 if (read_tty) 1040 if (read_tty) {
1046 FD_SET(fileno(stdin), &readfds); 1041 pfd[0].fd = fileno(stdin);
1047 if (write_tty) 1042 pfd[0].events = POLLIN;
1048 FD_SET(fileno(stdout), &writefds); 1043 }
1044 if (write_tty) {
1045 pfd[1].fd = fileno(stdout);
1046 pfd[1].events = POLLOUT;
1047 }
1049 } 1048 }
1049
1050 pfd[2].fd = SSL_get_fd(con);
1051 pfd[2].events = 0;
1050 if (read_ssl) 1052 if (read_ssl)
1051 FD_SET(SSL_get_fd(con), &readfds); 1053 pfd[2].events |= POLLIN;
1052 if (write_ssl) 1054 if (write_ssl)
1053 FD_SET(SSL_get_fd(con), &writefds); 1055 pfd[2].events |= POLLOUT;
1056
1054/* printf("mode tty(%d %d%d) ssl(%d%d)\n", 1057/* printf("mode tty(%d %d%d) ssl(%d%d)\n",
1055 tty_on,read_tty,write_tty,read_ssl,write_ssl);*/ 1058 tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
1056 1059
1057 i = select(width, &readfds, &writefds, 1060 i = poll(pfd, 3, ptimeout);
1058 NULL, timeoutp);
1059 if (i < 0) { 1061 if (i < 0) {
1060 BIO_printf(bio_err, "bad select %d\n", 1062 BIO_printf(bio_err, "bad select %d\n",
1061 errno); 1063 errno);
@@ -1066,7 +1068,11 @@ re_start:
1066 if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0) { 1068 if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0) {
1067 BIO_printf(bio_err, "TIMEOUT occured\n"); 1069 BIO_printf(bio_err, "TIMEOUT occured\n");
1068 } 1070 }
1069 if (!ssl_pending && FD_ISSET(SSL_get_fd(con), &writefds)) { 1071 if (!ssl_pending && (pfd[2].revents & (POLLOUT|POLLERR|POLLNVAL))) {
1072 if (pfd[2].revents & (POLLERR|POLLNVAL)) {
1073 BIO_printf(bio_err, "poll error");
1074 goto shut;
1075 }
1070 k = SSL_write(con, &(cbuf[cbuf_off]), 1076 k = SSL_write(con, &(cbuf[cbuf_off]),
1071 (unsigned int) cbuf_len); 1077 (unsigned int) cbuf_len);
1072 switch (SSL_get_error(con, k)) { 1078 switch (SSL_get_error(con, k)) {
@@ -1123,7 +1129,12 @@ re_start:
1123 ERR_print_errors(bio_err); 1129 ERR_print_errors(bio_err);
1124 goto shut; 1130 goto shut;
1125 } 1131 }
1126 } else if (!ssl_pending && FD_ISSET(fileno(stdout), &writefds)) { 1132 } else if (!ssl_pending &&
1133 (pfd[1].revents & (POLLOUT|POLLERR|POLLNVAL))) {
1134 if (pfd[1].revents & (POLLERR|POLLNVAL)) {
1135 BIO_printf(bio_err, "poll error");
1136 goto shut;
1137 }
1127 i = write(fileno(stdout), &(sbuf[sbuf_off]), sbuf_len); 1138 i = write(fileno(stdout), &(sbuf[sbuf_off]), sbuf_len);
1128 1139
1129 if (i <= 0) { 1140 if (i <= 0) {
@@ -1138,7 +1149,7 @@ re_start:
1138 read_ssl = 1; 1149 read_ssl = 1;
1139 write_tty = 0; 1150 write_tty = 0;
1140 } 1151 }
1141 } else if (ssl_pending || FD_ISSET(SSL_get_fd(con), &readfds)) { 1152 } else if (ssl_pending || (pfd[2].revents & (POLLIN|POLLHUP))) {
1142#ifdef RENEG 1153#ifdef RENEG
1143 { 1154 {
1144 static int iiii; 1155 static int iiii;
@@ -1188,7 +1199,11 @@ re_start:
1188 goto shut; 1199 goto shut;
1189 /* break; */ 1200 /* break; */
1190 } 1201 }
1191 } else if (FD_ISSET(fileno(stdin), &readfds)) { 1202 } else if (pfd[0].revents) {
1203 if (pfd[0].revents & (POLLERR|POLLNVAL)) {
1204 BIO_printf(bio_err, "poll error");
1205 goto shut;
1206 }
1192 if (crlf) { 1207 if (crlf) {
1193 int j, lf_num; 1208 int j, lf_num;
1194 1209
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
1279sv_body(char *hostname, int s, unsigned char *context) 1279sv_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) {