From 2b40eebf5baf6c2444ac6e47e03e446a75baecb3 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sat, 10 Oct 2026 09:09:39 +0700 Subject: [PATCH] android: close TCP probe sockets right after connecting tcpPing never closed its socket: every health/whitelist/home probe leaked an fd until GC and the peer's later FIN/RST woke the radio again. Co-Authored-By: Claude Opus 5.5 --- .../android/logic/connectivity/ConnectivityProbe.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/connectivity/ConnectivityProbe.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/connectivity/ConnectivityProbe.kt index b76fc4787..2644d2640 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/connectivity/ConnectivityProbe.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/connectivity/ConnectivityProbe.kt @@ -94,8 +94,12 @@ object ConnectivityProbe * throw (e.g. EPERM when the caller is disallowed from that * network), so it must stay inside the try */ val socket = if (network != null) network.socketFactory.createSocket() else Socket() - socket.tcpNoDelay = true - socket.connect(InetSocketAddress(host, port), timeoutMs) + /* close right away: a leaked socket holds an fd until GC and + * the peer's later FIN/RST wakes the radio a second time */ + socket.use { + it.tcpNoDelay = true + it.connect(InetSocketAddress(host, port), timeoutMs) + } ProbeResult(target = target, ok = true, rttMs = (System.nanoTime() - started) / 1_000_000) } catch (_: Exception)