summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2020-10-15 17:51:58 +0000
committerjsing <>2020-10-15 17:51:58 +0000
commit51e760a277d50f30ec1b1c9efe5f0d448e93e3e9 (patch)
tree164343e2cdd137d27580eca8c20c6c712c2a1907 /src
parent8fd8b5db1b575295bdb9074986cfb4e5e07e9cdf (diff)
downloadopenbsd-51e760a277d50f30ec1b1c9efe5f0d448e93e3e9.tar.gz
openbsd-51e760a277d50f30ec1b1c9efe5f0d448e93e3e9.tar.bz2
openbsd-51e760a277d50f30ec1b1c9efe5f0d448e93e3e9.zip
Improve poll and event handling.
In particular, ensure we clear events when the client or server side has completed and fix timeouts to ensure we use a non-zero timeout if present.
Diffstat (limited to 'src')
-rw-r--r--src/regress/lib/libssl/dtls/dtlstest.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/src/regress/lib/libssl/dtls/dtlstest.c b/src/regress/lib/libssl/dtls/dtlstest.c
index 8cb4822b33..166302db48 100644
--- a/src/regress/lib/libssl/dtls/dtlstest.c
+++ b/src/regress/lib/libssl/dtls/dtlstest.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: dtlstest.c,v 1.1 2020/10/14 15:49:14 jsing Exp $ */ 1/* $OpenBSD: dtlstest.c,v 1.2 2020/10/15 17:51:58 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2020 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -33,6 +33,8 @@ const char *server_key_file;
33 33
34char dtls_cookie[32]; 34char dtls_cookie[32];
35 35
36int debug = 0;
37
36static int 38static int
37datagram_pair(int *client_sock, int *server_sock, 39datagram_pair(int *client_sock, int *server_sock,
38 struct sockaddr_in *server_sin) 40 struct sockaddr_in *server_sin)
@@ -78,7 +80,11 @@ poll_timeout(SSL *client, SSL *server)
78 if (DTLSv1_get_timeout(server, &timeout)) 80 if (DTLSv1_get_timeout(server, &timeout))
79 server_timeout = timeout.tv_sec * 1000 + timeout.tv_usec / 1000; 81 server_timeout = timeout.tv_sec * 1000 + timeout.tv_usec / 1000;
80 82
81 if (client_timeout > 0 && client_timeout < server_timeout) 83 if (client_timeout <= 0)
84 return server_timeout;
85 if (client_timeout > 0 && server_timeout <= 0)
86 return client_timeout;
87 if (client_timeout < server_timeout)
82 return client_timeout; 88 return client_timeout;
83 89
84 return server_timeout; 90 return server_timeout;
@@ -201,7 +207,6 @@ ssl_error(SSL *ssl, const char *name, const char *desc, int ssl_ret,
201 *events = POLLOUT; 207 *events = POLLOUT;
202 } else if (ssl_err == SSL_ERROR_SYSCALL && errno == 0) { 208 } else if (ssl_err == SSL_ERROR_SYSCALL && errno == 0) {
203 /* Yup, this is apparently a thing... */ 209 /* Yup, this is apparently a thing... */
204 *events = 0;
205 } else { 210 } else {
206 fprintf(stderr, "FAIL: %s %s failed - ssl err = %d, errno = %d\n", 211 fprintf(stderr, "FAIL: %s %s failed - ssl err = %d, errno = %d\n",
207 name, desc, ssl_err, errno); 212 name, desc, ssl_err, errno);
@@ -263,25 +268,36 @@ do_client_server_loop(SSL *client, ssl_func client_func, SSL *server,
263 int client_done = 0, server_done = 0; 268 int client_done = 0, server_done = 0;
264 int i = 0; 269 int i = 0;
265 270
266 do { 271 pfd[0].revents = POLLIN;
267 if (poll(pfd, 2, poll_timeout(client, server)) == -1) 272 pfd[1].revents = POLLIN;
268 err(1, "poll");
269 273
274 do {
270 if (!client_done) { 275 if (!client_done) {
276 if (debug)
277 fprintf(stderr, "DEBUG: client loop\n");
271 if (DTLSv1_handle_timeout(client) > 0) 278 if (DTLSv1_handle_timeout(client) > 0)
272 fprintf(stderr, "INFO: client timeout\n"); 279 fprintf(stderr, "INFO: client timeout\n");
273 if (!client_func(client, "client", &client_done, 280 if (!client_func(client, "client", &client_done,
274 &pfd[0].events)) 281 &pfd[0].events))
275 return 0; 282 return 0;
283 if (client_done)
284 pfd[0].events = 0;
276 } 285 }
277 if (!server_done) { 286 if (!server_done) {
287 if (debug)
288 fprintf(stderr, "DEBUG: server loop\n");
278 if (DTLSv1_handle_timeout(server) > 0) 289 if (DTLSv1_handle_timeout(server) > 0)
279 fprintf(stderr, "INFO: server timeout\n"); 290 fprintf(stderr, "INFO: server timeout\n");
280 if (!server_func(server, "server", &server_done, 291 if (!server_func(server, "server", &server_done,
281 &pfd[1].events)) 292 &pfd[1].events))
282 return 0; 293 return 0;
294 if (server_done)
295 pfd[1].events = 0;
283 } 296 }
284 } while (i++ < 1000 && (!client_done || !server_done)); 297 if (poll(pfd, 2, poll_timeout(client, server)) == -1)
298 err(1, "poll");
299
300 } while (i++ < 100 && (!client_done || !server_done));
285 301
286 if (!client_done || !server_done) 302 if (!client_done || !server_done)
287 fprintf(stderr, "FAIL: gave up\n"); 303 fprintf(stderr, "FAIL: gave up\n");
@@ -340,7 +356,7 @@ dtlstest(struct dtls_test *dt)
340 pfd[0].fd = client_sock; 356 pfd[0].fd = client_sock;
341 pfd[0].events = POLLOUT; 357 pfd[0].events = POLLOUT;
342 pfd[1].fd = server_sock; 358 pfd[1].fd = server_sock;
343 pfd[1].events = 0; 359 pfd[1].events = POLLIN;
344 360
345 if (!do_client_server_loop(client, do_connect, server, do_accept, pfd)) { 361 if (!do_client_server_loop(client, do_connect, server, do_accept, pfd)) {
346 fprintf(stderr, "FAIL: client and server handshake failed\n"); 362 fprintf(stderr, "FAIL: client and server handshake failed\n");
@@ -349,6 +365,9 @@ dtlstest(struct dtls_test *dt)
349 365
350 /* XXX - do reads and writes. */ 366 /* XXX - do reads and writes. */
351 367
368 pfd[0].events = POLLOUT;
369 pfd[1].events = POLLOUT;
370
352 if (!do_client_server_loop(client, do_shutdown, server, do_shutdown, pfd)) { 371 if (!do_client_server_loop(client, do_shutdown, server, do_shutdown, pfd)) {
353 fprintf(stderr, "FAIL: client and server shutdown failed\n"); 372 fprintf(stderr, "FAIL: client and server shutdown failed\n");
354 goto failure; 373 goto failure;