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 =
|
let addr =
|
||||||
check_scheme_and_get_socket_addr::<SocketAddr>(&self.addr, "quic", self.ip_version)
|
check_scheme_and_get_socket_addr::<SocketAddr>(&self.addr, "quic", self.ip_version)
|
||||||
.await?;
|
.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() {
|
let local_addr = if addr.is_ipv4() {
|
||||||
"0.0.0.0:0"
|
"0.0.0.0:0"
|
||||||
} else {
|
} else {
|
||||||
@@ -257,7 +263,12 @@ impl TunnelConnector for QUICTunnelConnector {
|
|||||||
// connect to server
|
// connect to server
|
||||||
let connection = endpoint
|
let connection = endpoint
|
||||||
.connect(addr, "localhost")
|
.connect(addr, "localhost")
|
||||||
.unwrap()
|
.map_err(|e| {
|
||||||
|
TunnelError::InvalidAddr(format!(
|
||||||
|
"failed to create QUIC connection, url: {}, error: {}",
|
||||||
|
self.addr, e
|
||||||
|
))
|
||||||
|
})?
|
||||||
.await
|
.await
|
||||||
.with_context(|| "connect failed")?;
|
.with_context(|| "connect failed")?;
|
||||||
tracing::info!("[client] connected: addr={}", connection.remote_address());
|
tracing::info!("[client] connected: addr={}", connection.remote_address());
|
||||||
@@ -300,7 +311,7 @@ impl TunnelConnector for QUICTunnelConnector {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use crate::tunnel::{
|
use crate::tunnel::{
|
||||||
common::tests::{_tunnel_bench, _tunnel_pingpong},
|
common::tests::{_tunnel_bench, _tunnel_pingpong},
|
||||||
IpVersion,
|
IpVersion, TunnelConnector,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
@@ -355,4 +366,11 @@ mod tests {
|
|||||||
let port = listener.local_url().port().unwrap();
|
let port = listener.local_url().port().unwrap();
|
||||||
assert!(port > 0);
|
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