fix panic when wireguard tunnel encounter udp recv error (#299)
Some checks failed
EasyTier Core / pre_job (push) Has been cancelled
EasyTier GUI / pre_job (push) Has been cancelled
EasyTier Mobile / pre_job (push) Has been cancelled
EasyTier Test / pre_job (push) Has been cancelled
EasyTier Core / build (freebsd-13.2-x86_64, 13.2, ubuntu-latest, x86_64-unknown-freebsd) (push) Has been cancelled
EasyTier Core / build (linux-aarch64, ubuntu-latest, aarch64-unknown-linux-musl) (push) Has been cancelled
EasyTier Core / build (linux-arm, ubuntu-latest, arm-unknown-linux-musleabi) (push) Has been cancelled
EasyTier Core / build (linux-armhf, ubuntu-latest, arm-unknown-linux-musleabihf) (push) Has been cancelled
EasyTier Core / build (linux-armv7, ubuntu-latest, armv7-unknown-linux-musleabi) (push) Has been cancelled
EasyTier Core / build (linux-armv7hf, ubuntu-latest, armv7-unknown-linux-musleabihf) (push) Has been cancelled
EasyTier Core / build (linux-mips, ubuntu-latest, mips-unknown-linux-musl) (push) Has been cancelled
EasyTier Core / build (linux-mipsel, ubuntu-latest, mipsel-unknown-linux-musl) (push) Has been cancelled
EasyTier Core / build (linux-x86_64, ubuntu-latest, x86_64-unknown-linux-musl) (push) Has been cancelled
EasyTier Core / build (macos-aarch64, macos-latest, aarch64-apple-darwin) (push) Has been cancelled
EasyTier Core / build (macos-x86_64, macos-latest, x86_64-apple-darwin) (push) Has been cancelled
EasyTier Core / build (windows-x86_64, windows-latest, x86_64-pc-windows-msvc) (push) Has been cancelled
EasyTier Core / core-result (push) Has been cancelled
EasyTier GUI / build-gui (linux-aarch64, aarch64-unknown-linux-gnu, ubuntu-latest, aarch64-unknown-linux-musl) (push) Has been cancelled
EasyTier GUI / build-gui (linux-x86_64, x86_64-unknown-linux-gnu, ubuntu-latest, x86_64-unknown-linux-musl) (push) Has been cancelled
EasyTier GUI / build-gui (macos-aarch64, aarch64-apple-darwin, macos-latest, aarch64-apple-darwin) (push) Has been cancelled
EasyTier GUI / build-gui (macos-x86_64, x86_64-apple-darwin, macos-latest, x86_64-apple-darwin) (push) Has been cancelled
EasyTier GUI / build-gui (windows-x86_64, x86_64-pc-windows-msvc, windows-latest, x86_64-pc-windows-msvc) (push) Has been cancelled
EasyTier GUI / gui-result (push) Has been cancelled
EasyTier Mobile / build-mobile (android, ubuntu-latest, android) (push) Has been cancelled
EasyTier Mobile / mobile-result (push) Has been cancelled
EasyTier Test / test (push) Has been cancelled

This commit is contained in:
Sijie.Sun 2024-09-02 09:37:34 +08:00 committed by GitHub
parent f07b3ee9c6
commit 1609c97574
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 16 additions and 3 deletions

View File

@ -91,7 +91,7 @@ impl GlobalCtx {
let net_ns = NetNS::new(config_fs.get_netns()); let net_ns = NetNS::new(config_fs.get_netns());
let hostname = config_fs.get_hostname(); let hostname = config_fs.get_hostname();
let (event_bus, _) = tokio::sync::broadcast::channel(100); let (event_bus, _) = tokio::sync::broadcast::channel(1024);
let stun_info_collection = Arc::new(StunInfoCollector::new_with_default_servers()); let stun_info_collection = Arc::new(StunInfoCollector::new_with_default_servers());

View File

@ -634,7 +634,14 @@ impl WgTunnelConnector {
let handshake = wg_peer.create_handshake_init().await; let handshake = wg_peer.create_handshake_init().await;
udp.send_to(&handshake, addr).await?; udp.send_to(&handshake, addr).await?;
let mut buf = [0u8; MAX_PACKET]; let mut buf = [0u8; MAX_PACKET];
let (n, recv_addr) = udp.recv_from(&mut buf).await.unwrap(); let (n, recv_addr) = match udp.recv_from(&mut buf).await {
Ok(ret) => ret,
Err(e) => {
tracing::error!("Failed to receive handshake response: {}", e);
return Err(TunnelError::IOError(e));
}
};
if recv_addr != addr { if recv_addr != addr {
tracing::warn!(?recv_addr, "Received packet from changed address"); tracing::warn!(?recv_addr, "Received packet from changed address");
} }
@ -646,7 +653,13 @@ impl WgTunnelConnector {
data.handle_one_packet_from_peer(&mut sink, &buf[..n]).await; data.handle_one_packet_from_peer(&mut sink, &buf[..n]).await;
loop { loop {
let mut buf = vec![0u8; MAX_PACKET]; let mut buf = vec![0u8; MAX_PACKET];
let (n, _) = data.udp.recv_from(&mut buf).await.unwrap(); let (n, _) = match udp.recv_from(&mut buf).await {
Ok(ret) => ret,
Err(e) => {
tracing::error!("Failed to receive wg packet: {}", e);
break;
}
};
data.handle_one_packet_from_peer(&mut sink, &buf[..n]).await; data.handle_one_packet_from_peer(&mut sink, &buf[..n]).await;
} }
}); });