diff options
author | jsing <> | 2020-10-15 17:51:58 +0000 |
---|---|---|
committer | jsing <> | 2020-10-15 17:51:58 +0000 |
commit | 51e760a277d50f30ec1b1c9efe5f0d448e93e3e9 (patch) | |
tree | 164343e2cdd137d27580eca8c20c6c712c2a1907 /src | |
parent | 8fd8b5db1b575295bdb9074986cfb4e5e07e9cdf (diff) | |
download | openbsd-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.c | 35 |
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 | ||
34 | char dtls_cookie[32]; | 34 | char dtls_cookie[32]; |
35 | 35 | ||
36 | int debug = 0; | ||
37 | |||
36 | static int | 38 | static int |
37 | datagram_pair(int *client_sock, int *server_sock, | 39 | datagram_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; |