From f3f2cf1c17d4d6a1bb3f7b567c795aa83422ca91 Mon Sep 17 00:00:00 2001 From: ospab Date: Sat, 30 May 2026 02:01:31 +0300 Subject: [PATCH] fix(client): bind SOCKS5 UDP socket to IPv6 properly, and fix 100% CPU spin in Android TUN reader --- ostp-client/src/tunnel/native_handler.rs | 4 ++-- ostp-client/src/tunnel/udp_nat.rs | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ostp-client/src/tunnel/native_handler.rs b/ostp-client/src/tunnel/native_handler.rs index e23d2d4..dfe1194 100644 --- a/ostp-client/src/tunnel/native_handler.rs +++ b/ostp-client/src/tunnel/native_handler.rs @@ -329,8 +329,8 @@ pub async fn run_native_tunnel_from_fd( }) { Ok(Ok(n)) if n > 0 => n as usize, Ok(Ok(n)) if n == 0 => break, // EOF - Ok(Ok(_n)) => continue, // Error reading packet, skip to next - Ok(Err(_)) => continue, // Should not happen with try_io + Ok(Ok(_n)) => break, // Fatal error reading TUN, must break to prevent 100% CPU spin + Ok(Err(_)) => break, Err(_would_block) => continue, }; diff --git a/ostp-client/src/tunnel/udp_nat.rs b/ostp-client/src/tunnel/udp_nat.rs index 6f05e15..d1e34eb 100644 --- a/ostp-client/src/tunnel/udp_nat.rs +++ b/ostp-client/src/tunnel/udp_nat.rs @@ -96,7 +96,10 @@ async fn start_udp_session( } } - let udp = UdpSocket::bind("127.0.0.1:0").await?; + let udp = match relay_addr { + SocketAddr::V4(_) => UdpSocket::bind("127.0.0.1:0").await?, + SocketAddr::V6(_) => UdpSocket::bind("[::1]:0").await.or_else(|_| UdpSocket::bind("[::]:0").await)?, + }; let mut buf = vec![0u8; 65536]; @@ -115,7 +118,7 @@ async fn start_udp_session( } packet.extend_from_slice(&dst.port().to_be_bytes()); packet.extend_from_slice(&payload); - udp.send_to(&packet, relay_addr).await?; + let _ = udp.send_to(&packet, relay_addr).await; } Ok(None) => break, Err(_) => break, // timeout