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:
fanyang
2026-02-14 17:10:29 +08:00
committed by GitHub
parent 7a26640c26
commit fe4e77979d
+20 -2
View File
@@ -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);
}
}