mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-05-06 17:59:11 +00:00
fix: avoid panic for quic peer urls using port 0 (#1905)
Prevent crashes when users input quic://...:0 by rejecting port 0 explicitly and propagating connect setup errors. Add a regression test to ensure invalid QUIC targets fail gracefully. Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -245,6 +245,12 @@ impl TunnelConnector for QUICTunnelConnector {
|
||||
let addr =
|
||||
check_scheme_and_get_socket_addr::<SocketAddr>(&self.addr, "quic", self.ip_version)
|
||||
.await?;
|
||||
if addr.port() == 0 {
|
||||
return Err(TunnelError::InvalidAddr(format!(
|
||||
"invalid remote QUIC port 0 in url: {} (port 0 is not a valid QUIC port)",
|
||||
self.addr
|
||||
)));
|
||||
}
|
||||
let local_addr = if addr.is_ipv4() {
|
||||
"0.0.0.0:0"
|
||||
} else {
|
||||
@@ -257,7 +263,12 @@ impl TunnelConnector for QUICTunnelConnector {
|
||||
// connect to server
|
||||
let connection = endpoint
|
||||
.connect(addr, "localhost")
|
||||
.unwrap()
|
||||
.map_err(|e| {
|
||||
TunnelError::InvalidAddr(format!(
|
||||
"failed to create QUIC connection, url: {}, error: {}",
|
||||
self.addr, e
|
||||
))
|
||||
})?
|
||||
.await
|
||||
.with_context(|| "connect failed")?;
|
||||
tracing::info!("[client] connected: addr={}", connection.remote_address());
|
||||
@@ -300,7 +311,7 @@ impl TunnelConnector for QUICTunnelConnector {
|
||||
mod tests {
|
||||
use crate::tunnel::{
|
||||
common::tests::{_tunnel_bench, _tunnel_pingpong},
|
||||
IpVersion,
|
||||
IpVersion, TunnelConnector,
|
||||
};
|
||||
|
||||
use super::*;
|
||||
@@ -355,4 +366,11 @@ mod tests {
|
||||
let port = listener.local_url().port().unwrap();
|
||||
assert!(port > 0);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn quic_connector_reject_port_zero() {
|
||||
let mut connector = QUICTunnelConnector::new("quic://127.0.0.1:0".parse().unwrap());
|
||||
let err = connector.connect().await.unwrap_err().to_string();
|
||||
assert!(err.contains("port 0"), "unexpected error: {}", err);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user