Skip to content

Commit 1093a36

Browse files
committed
Fix flaky tcp bind on Windows test runs
Windows test code pre-picked a random port via GetRandomPort() (returning a value in [49152, 65535]) before calling bind(), with no check that the port was free and no retry on collision. Under load this occasionally collided with an already-bound port and aborted the test with "tcp bind failed", producing intermittent Jenkins failures (e.g. PRB windows-test-v2 #17140 in the OCSP responder test). The Unix path already does the right thing: bind to port 0 (OS-assigned ephemeral) and read the port back via getsockname(). The same primitives exist in Winsock 1.1, so drop the USE_WINDOWS_API guard around the getsockname block in tcp_listen()/udp_accept() and remove the per-caller GetRandomPort() workarounds in the OCSP responder, server example, and the api.c / test_ossl_bio.c test sites. socklen_t is already typedef'd as int on Windows in test.h. GetRandomPort() itself is left in place since it is a static inline in a shipped public test header.
1 parent 7b53303 commit 1093a36

5 files changed

Lines changed: 2 additions & 75 deletions

File tree

examples/ocsp_responder/ocsp_responder.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -943,13 +943,6 @@ THREAD_RETURN WOLFSSL_THREAD ocsp_responder_test(void* args)
943943
}
944944
}
945945

946-
#ifdef USE_WINDOWS_API
947-
if (opts.port == 0) {
948-
/* Generate random port for testing */
949-
opts.port = GetRandomPort();
950-
}
951-
#endif /* USE_WINDOWS_API */
952-
953946
/* Create and listen on server socket */
954947
tcp_listen(&sockfd, &opts.port, 1, 0, 0);
955948

examples/server/server.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3231,13 +3231,6 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args)
32313231
}
32323232
#endif
32333233

3234-
#ifdef USE_WINDOWS_API
3235-
if (port == 0) {
3236-
/* Generate random port for testing */
3237-
port = GetRandomPort();
3238-
}
3239-
#endif /* USE_WINDOWS_API */
3240-
32413234
#ifdef WOLFSSL_ASYNC_CRYPT
32423235
ret = wolfAsync_DevOpen(&devId);
32433236
if (ret < 0) {

tests/api.c

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6050,11 +6050,6 @@ void test_wolfSSL_client_server_nofail_ex(callback_functions* client_cb,
60506050
StartTCP();
60516051
InitTcpReady(&ready);
60526052

6053-
#if defined(USE_WINDOWS_API)
6054-
/* use RNG to get random port if using windows */
6055-
ready.port = GetRandomPort();
6056-
#endif
6057-
60586053
server_args.signal = &ready;
60596054
server_args.callbacks = server_cb;
60606055
client_args.signal = &ready;
@@ -6748,11 +6743,6 @@ static int test_wolfSSL_read_write(void)
67486743
StartTCP();
67496744
InitTcpReady(&ready);
67506745

6751-
#if defined(USE_WINDOWS_API)
6752-
/* use RNG to get random port if using windows */
6753-
ready.port = GetRandomPort();
6754-
#endif
6755-
67566746
server_args.signal = &ready;
67576747
client_args.signal = &ready;
67586748

@@ -6841,11 +6831,6 @@ static int test_wolfSSL_reuse_WOLFSSLobj(void)
68416831
StartTCP();
68426832
InitTcpReady(&ready);
68436833

6844-
#if defined(USE_WINDOWS_API)
6845-
/* use RNG to get random port if using windows */
6846-
ready.port = GetRandomPort();
6847-
#endif
6848-
68496834
client_cbf.method = wolfTLSv1_2_client_method;
68506835
server_cbf.method = wolfTLSv1_2_server_method;
68516836
client_args.callbacks = &client_cbf;
@@ -8119,11 +8104,6 @@ static int test_wolfSSL_dtls_export(void)
81198104

81208105
InitTcpReady(&ready);
81218106

8122-
#if defined(USE_WINDOWS_API)
8123-
/* use RNG to get random port if using windows */
8124-
ready.port = GetRandomPort();
8125-
#endif
8126-
81278107
/* set using dtls */
81288108
XMEMSET(&client_args, 0, sizeof(func_args));
81298109
XMEMSET(&server_args, 0, sizeof(func_args));
@@ -8194,11 +8174,6 @@ static int test_wolfSSL_dtls_export(void)
81948174

81958175
InitTcpReady(&ready);
81968176

8197-
#if defined(USE_WINDOWS_API)
8198-
/* use RNG to get random port if using windows */
8199-
ready.port = GetRandomPort();
8200-
#endif
8201-
82028177
/* set using dtls */
82038178
XMEMSET(&server_args, 0, sizeof(func_args));
82048179
XMEMSET(&server_cbf, 0, sizeof(callback_functions));
@@ -8675,11 +8650,6 @@ static int test_wolfSSL_tls_export_run(method_provider server_method,
86758650

86768651
InitTcpReady(&ready);
86778652

8678-
#if defined(USE_WINDOWS_API)
8679-
/* use RNG to get random port if using windows */
8680-
ready.port = GetRandomPort();
8681-
#endif
8682-
86838653
XMEMSET(&server_args, 0, sizeof(func_args));
86848654
XMEMSET(&server_cbf, 0, sizeof(callback_functions));
86858655
server_cbf.method = server_method;
@@ -8795,11 +8765,6 @@ static void test_wolfSSL_client_server(callback_functions* client_callbacks,
87958765
/* RUN Server side */
87968766
InitTcpReady(&ready);
87978767

8798-
#if defined(USE_WINDOWS_API)
8799-
/* use RNG to get random port if using windows */
8800-
ready.port = GetRandomPort();
8801-
#endif
8802-
88038768
server_args.signal = &ready;
88048769
client_args.signal = &ready;
88058770
start_thread(run_wolfssl_server, &server_args, &serverThread);
@@ -18350,11 +18315,6 @@ static int test_wolfSSL_SESSION(void)
1835018315
StartTCP();
1835118316
InitTcpReady(&ready);
1835218317

18353-
#if defined(USE_WINDOWS_API)
18354-
/* use RNG to get random port if using windows */
18355-
ready.port = GetRandomPort();
18356-
#endif
18357-
1835818318
server_args.signal = &ready;
1835918319
start_thread(test_server_nofail, &server_args, &serverThread);
1836018320
wait_tcp_ready(&server_args);
@@ -26888,11 +26848,6 @@ static int test_wolfSSL_read_detect_TCP_disconnect(void)
2688826848
StartTCP();
2688926849
InitTcpReady(&ready);
2689026850

26891-
#if defined(USE_WINDOWS_API)
26892-
/* use RNG to get random port if using windows */
26893-
ready.port = GetRandomPort();
26894-
#endif
26895-
2689626851
XMEMSET(&client_args, 0, sizeof(func_args));
2689726852
XMEMSET(&server_args, 0, sizeof(func_args));
2689826853

tests/api/test_ossl_bio.c

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -357,10 +357,6 @@ int test_wolfSSL_BIO_should_retry(void)
357357
StartTCP();
358358
InitTcpReady(&ready);
359359

360-
#if defined(USE_WINDOWS_API)
361-
/* use RNG to get random port if using windows */
362-
ready.port = GetRandomPort();
363-
#endif
364360

365361
server_args.signal = &ready;
366362
start_thread(test_server_nofail, &server_args, &serverThread);
@@ -465,10 +461,6 @@ int test_wolfSSL_BIO_connect(void)
465461
XMEMSET(&server_args, 0, sizeof(func_args));
466462
StartTCP();
467463
InitTcpReady(&ready);
468-
#if defined(USE_WINDOWS_API)
469-
/* use RNG to get random port if using windows */
470-
ready.port = GetRandomPort();
471-
#endif
472464
server_args.signal = &ready;
473465
start_thread(test_server_nofail, &server_args, &serverThread);
474466
wait_tcp_ready(&server_args);
@@ -512,10 +504,6 @@ int test_wolfSSL_BIO_connect(void)
512504
XMEMSET(&server_args, 0, sizeof(func_args));
513505
StartTCP();
514506
InitTcpReady(&ready);
515-
#if defined(USE_WINDOWS_API)
516-
/* use RNG to get random port if using windows */
517-
ready.port = GetRandomPort();
518-
#endif
519507
server_args.signal = &ready;
520508
start_thread(test_server_nofail, &server_args, &serverThread);
521509
wait_tcp_ready(&server_args);

wolfssl/test.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1697,8 +1697,7 @@ static WC_INLINE void tcp_listen(SOCKET_T* sockfd, word16* port, int useAnyAddr,
16971697
if (listen(*sockfd, SOCK_LISTEN_MAX_QUEUE) != 0)
16981698
err_sys_with_errno("tcp listen failed");
16991699
}
1700-
#if !defined(USE_WINDOWS_API) && !defined(WOLFSSL_TIRTOS) \
1701-
&& !defined(WOLFSSL_ZEPHYR)
1700+
#if !defined(WOLFSSL_TIRTOS) && !defined(WOLFSSL_ZEPHYR)
17021701
if (*port == 0) {
17031702
socklen_t len = sizeof(addr);
17041703
if (getsockname(*sockfd, (struct sockaddr*)&addr, &len) == 0) {
@@ -1770,8 +1769,7 @@ static WC_INLINE void udp_accept(SOCKET_T* sockfd, SOCKET_T* clientfd,
17701769
if (bind(*sockfd, (const struct sockaddr*)&addr, sizeof(addr)) != 0)
17711770
err_sys_with_errno("tcp bind failed");
17721771

1773-
#if !defined(USE_WINDOWS_API) && !defined(WOLFSSL_TIRTOS) && \
1774-
!defined(SINGLE_THREADED)
1772+
#if !defined(WOLFSSL_TIRTOS) && !defined(SINGLE_THREADED)
17751773
if (port == 0) {
17761774
socklen_t len = sizeof(addr);
17771775
if (getsockname(*sockfd, (struct sockaddr*)&addr, &len) == 0) {

0 commit comments

Comments
 (0)