From ae05c4efb6d4474a2ef30ccf69af1343afd1b9dd Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Thu, 26 Feb 2026 10:19:40 +0300 Subject: [PATCH] net: fix importing net.openssl on linux causes tcp_conn.accept to fail (fixes #21257) --- vlib/net/common.c.v | 18 +++++++------- .../openssl_import_tcp_accept_test.c.v | 24 +++++++++++++++++++ vlib/net/unix/common.c.v | 18 +++++++------- 3 files changed, 42 insertions(+), 18 deletions(-) create mode 100644 vlib/net/openssl/openssl_import_tcp_accept_test.c.v diff --git a/vlib/net/common.c.v b/vlib/net/common.c.v index 9dbdfc6e2..c1a56e6cc 100644 --- a/vlib/net/common.c.v +++ b/vlib/net/common.c.v @@ -112,20 +112,20 @@ fn select(handle int, test Select, timeout time.Duration) !bool { C.FD_ZERO(&set) C.FD_SET(handle, &set) - seconds := timeout / time.second - microseconds := time.Duration(timeout - (seconds * time.second)).microseconds() - - mut tt := C.timeval{ - tv_sec: u64(seconds) - tv_usec: u64(microseconds) - } - + mut tt := C.timeval{} mut timeval_timeout := &tt // infinite timeout is signaled by passing null as the timeout to - // select + // select. if timeout == infinite_timeout { timeval_timeout = &C.timeval(unsafe { nil }) + } else { + seconds := timeout / time.second + microseconds := time.Duration(timeout - (seconds * time.second)).microseconds() + tt = C.timeval{ + tv_sec: u64(seconds) + tv_usec: u64(microseconds) + } } match test { diff --git a/vlib/net/openssl/openssl_import_tcp_accept_test.c.v b/vlib/net/openssl/openssl_import_tcp_accept_test.c.v new file mode 100644 index 000000000..e5a198748 --- /dev/null +++ b/vlib/net/openssl/openssl_import_tcp_accept_test.c.v @@ -0,0 +1,24 @@ +// vtest build: present_openssl? +import net +import net.openssl as _ + +fn test_importing_openssl_does_not_break_tcp_listener_accept() { + mut listener := net.listen_tcp(.ip, '127.0.0.1:0', net.ListenOptions{}) or { panic(err) } + defer { + listener.close() or {} + } + + address := listener.addr() or { panic(err) } + mut client := net.dial_tcp(address.str()) or { panic(err) } + defer { + client.close() or {} + } + + mut server := listener.accept() or { panic(err) } + defer { + server.close() or {} + } + + peer := server.peer_addr() or { panic(err) } + assert peer.str().len > 0 +} diff --git a/vlib/net/unix/common.c.v b/vlib/net/unix/common.c.v index f3a5ca160..3629aa7c8 100644 --- a/vlib/net/unix/common.c.v +++ b/vlib/net/unix/common.c.v @@ -35,20 +35,20 @@ fn select(handle int, test Select, timeout time.Duration) !bool { C.FD_ZERO(&set) C.FD_SET(handle, &set) - seconds := timeout / time.second - microseconds := time.Duration(timeout - (seconds * time.second)).microseconds() - - mut tt := C.timeval{ - tv_sec: u64(seconds) - tv_usec: u64(microseconds) - } - + mut tt := C.timeval{} mut timeval_timeout := &tt // infinite timeout is signaled by passing null as the timeout to - // select + // select. if timeout == infinite_timeout { timeval_timeout = &C.timeval(unsafe { nil }) + } else { + seconds := timeout / time.second + microseconds := time.Duration(timeout - (seconds * time.second)).microseconds() + tt = C.timeval{ + tv_sec: u64(seconds) + tv_usec: u64(microseconds) + } } match test { -- 2.39.5