From 08abc44fa5eec6639cc10d60efa6807038d107ad Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Thu, 19 Feb 2026 13:21:07 +0100 Subject: [PATCH 1/3] Add test for SGX delayed host lookup via ToSocketAddr --- library/std/src/sys/net/connection/sgx.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/library/std/src/sys/net/connection/sgx.rs b/library/std/src/sys/net/connection/sgx.rs index 8c9c17d3f1714..1b3027c0cfb2d 100644 --- a/library/std/src/sys/net/connection/sgx.rs +++ b/library/std/src/sys/net/connection/sgx.rs @@ -512,3 +512,16 @@ pub fn lookup_host(host: &str, port: u16) -> io::Result { NonIpSockAddr { host: format!("{host}:{port}") }, )) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn unparseable_sockaddr() { + let addr = "local"; + let error = addr.to_socket_addrs().unwrap_err(); + let non_ip_addr = error.downcast::().unwrap(); + assert_eq!(addr, non_ip_addr.host); + } +} From e2b308726ae6336c837688664953097ce2cab83c Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Tue, 24 Feb 2026 12:00:05 -0800 Subject: [PATCH 2/3] Fix SGX delayed host lookup via ToSocketAddr --- library/std/src/net/mod.rs | 4 +++ library/std/src/net/socket_addr.rs | 34 +++++++++++-------- library/std/src/sys/net/connection/motor.rs | 2 ++ library/std/src/sys/net/connection/sgx.rs | 9 ++--- .../std/src/sys/net/connection/socket/mod.rs | 2 ++ .../std/src/sys/net/connection/uefi/mod.rs | 2 ++ .../std/src/sys/net/connection/unsupported.rs | 2 ++ library/std/src/sys/net/connection/wasip1.rs | 2 ++ .../std/src/sys/net/connection/xous/mod.rs | 2 ++ 9 files changed, 41 insertions(+), 18 deletions(-) diff --git a/library/std/src/net/mod.rs b/library/std/src/net/mod.rs index 3e4447eb33f2a..5af3dc32c95d1 100644 --- a/library/std/src/net/mod.rs +++ b/library/std/src/net/mod.rs @@ -70,3 +70,7 @@ pub enum Shutdown { #[stable(feature = "rust1", since = "1.0.0")] Both, } + +// allow(unused_imports): This function is only used on some targets +#[allow(unused_imports)] +pub(crate) use socket_addr::lookup_host_string; diff --git a/library/std/src/net/socket_addr.rs b/library/std/src/net/socket_addr.rs index 8214ad381f1f7..fac570d72bccd 100644 --- a/library/std/src/net/socket_addr.rs +++ b/library/std/src/net/socket_addr.rs @@ -189,9 +189,23 @@ impl ToSocketAddrs for (Ipv6Addr, u16) { } } -fn lookup_host(host: &str, port: u16) -> io::Result> { - let addrs = crate::sys::net::lookup_host(host, port)?; - Ok(Vec::from_iter(addrs).into_iter()) +// Default implementation, this shouldn't be called directly by the function's +// path in this module. Instead, use the platform-specific implementation +// (which may be this one). +// +// allow(dead_code): This function is only used on some targets +#[allow(dead_code)] +pub(crate) fn lookup_host_string(addr: &str) -> io::Result> { + // Split the string by ':' and convert the second part to u16... + let Some((host, port_str)) = addr.rsplit_once(':') else { + return Err(io::const_error!(io::ErrorKind::InvalidInput, "invalid socket address")); + }; + let Ok(port) = port_str.parse::() else { + return Err(io::const_error!(io::ErrorKind::InvalidInput, "invalid port value")); + }; + + // ... and make the system look up the host. + crate::sys::net::lookup_host(host, port) } #[stable(feature = "rust1", since = "1.0.0")] @@ -207,7 +221,7 @@ impl ToSocketAddrs for (&str, u16) { } // Otherwise, make the system look it up. - lookup_host(host, port) + crate::sys::net::lookup_host(host, port).map(|addrs| Vec::from_iter(addrs).into_iter()) } } @@ -229,16 +243,8 @@ impl ToSocketAddrs for str { return Ok(vec![addr].into_iter()); } - // Otherwise, split the string by ':' and convert the second part to u16... - let Some((host, port_str)) = self.rsplit_once(':') else { - return Err(io::const_error!(io::ErrorKind::InvalidInput, "invalid socket address")); - }; - let Ok(port) = port_str.parse::() else { - return Err(io::const_error!(io::ErrorKind::InvalidInput, "invalid port value")); - }; - - // ... and make the system look up the host. - lookup_host(host, port) + // Otherwise, make the system look it up. + crate::sys::net::lookup_host_string(self).map(|addrs| Vec::from_iter(addrs).into_iter()) } } diff --git a/library/std/src/sys/net/connection/motor.rs b/library/std/src/sys/net/connection/motor.rs index 79a528792106c..8555291adc3c4 100644 --- a/library/std/src/sys/net/connection/motor.rs +++ b/library/std/src/sys/net/connection/motor.rs @@ -395,6 +395,8 @@ pub struct LookupHost { addresses: alloc::collections::VecDeque, } +pub(crate) use crate::net::lookup_host_string; + pub fn lookup_host(host: &str, port: u16) -> io::Result { let (_port, addresses) = moto_rt::net::lookup_host(host, port).map_err(map_motor_error)?; Ok(LookupHost { addresses }) diff --git a/library/std/src/sys/net/connection/sgx.rs b/library/std/src/sys/net/connection/sgx.rs index 1b3027c0cfb2d..6ecb0a69a027b 100644 --- a/library/std/src/sys/net/connection/sgx.rs +++ b/library/std/src/sys/net/connection/sgx.rs @@ -506,11 +506,12 @@ impl Iterator for LookupHost { } } +pub fn lookup_host_string(addr: impl Into) -> io::Result { + Err(io::Error::new(io::ErrorKind::Uncategorized, NonIpSockAddr { host: addr.into() })) +} + pub fn lookup_host(host: &str, port: u16) -> io::Result { - Err(io::Error::new( - io::ErrorKind::Uncategorized, - NonIpSockAddr { host: format!("{host}:{port}") }, - )) + lookup_host_string(format!("{host}:{port}")) } #[cfg(test)] diff --git a/library/std/src/sys/net/connection/socket/mod.rs b/library/std/src/sys/net/connection/socket/mod.rs index 256b99dfa9874..54595b5a895e0 100644 --- a/library/std/src/sys/net/connection/socket/mod.rs +++ b/library/std/src/sys/net/connection/socket/mod.rs @@ -340,6 +340,8 @@ impl Drop for LookupHost { } } +pub(crate) use crate::net::lookup_host_string; + pub fn lookup_host(host: &str, port: u16) -> io::Result { init(); run_with_cstr(host.as_bytes(), &|c_host| { diff --git a/library/std/src/sys/net/connection/uefi/mod.rs b/library/std/src/sys/net/connection/uefi/mod.rs index 107a3e23733de..299460572a87d 100644 --- a/library/std/src/sys/net/connection/uefi/mod.rs +++ b/library/std/src/sys/net/connection/uefi/mod.rs @@ -345,6 +345,8 @@ impl Iterator for LookupHost { } } +pub(crate) use crate::net::lookup_host_string; + pub fn lookup_host(_host: &str, _port: u16) -> io::Result { unsupported() } diff --git a/library/std/src/sys/net/connection/unsupported.rs b/library/std/src/sys/net/connection/unsupported.rs index fb18e8dec557c..7089e17a7beda 100644 --- a/library/std/src/sys/net/connection/unsupported.rs +++ b/library/std/src/sys/net/connection/unsupported.rs @@ -311,6 +311,8 @@ impl Iterator for LookupHost { } } +pub(crate) use crate::net::lookup_host_string; + pub fn lookup_host(_host: &str, _port: u16) -> io::Result { unsupported() } diff --git a/library/std/src/sys/net/connection/wasip1.rs b/library/std/src/sys/net/connection/wasip1.rs index 95a4ab2fbf0fd..1ef12e5ec4cf1 100644 --- a/library/std/src/sys/net/connection/wasip1.rs +++ b/library/std/src/sys/net/connection/wasip1.rs @@ -483,6 +483,8 @@ impl Iterator for LookupHost { } } +pub(crate) use crate::net::lookup_host_string; + pub fn lookup_host(_host: &str, _port: u16) -> io::Result { unsupported() } diff --git a/library/std/src/sys/net/connection/xous/mod.rs b/library/std/src/sys/net/connection/xous/mod.rs index 0f77be5c3fac8..f3fd83a10f2c6 100644 --- a/library/std/src/sys/net/connection/xous/mod.rs +++ b/library/std/src/sys/net/connection/xous/mod.rs @@ -46,3 +46,5 @@ pub struct GetAddress { } pub use dns::lookup_host; + +pub(crate) use crate::net::lookup_host_string; From fadd60ba47e21cdbacec7c081cdc5f80fc5aa2dd Mon Sep 17 00:00:00 2001 From: Sinan Nalkaya Date: Fri, 13 Mar 2026 11:42:49 +0100 Subject: [PATCH 3/3] Move default implementation of lookup_host_string to sys/net/connection. --- library/std/src/net/mod.rs | 4 ---- library/std/src/net/socket_addr.rs | 19 ------------------- library/std/src/sys/net/connection/mod.rs | 19 +++++++++++++++++++ library/std/src/sys/net/connection/motor.rs | 2 -- library/std/src/sys/net/connection/sgx.rs | 2 +- .../std/src/sys/net/connection/socket/mod.rs | 2 -- .../std/src/sys/net/connection/uefi/mod.rs | 2 -- .../std/src/sys/net/connection/unsupported.rs | 2 -- library/std/src/sys/net/connection/wasip1.rs | 2 -- .../std/src/sys/net/connection/xous/mod.rs | 2 -- 10 files changed, 20 insertions(+), 36 deletions(-) diff --git a/library/std/src/net/mod.rs b/library/std/src/net/mod.rs index 5af3dc32c95d1..3e4447eb33f2a 100644 --- a/library/std/src/net/mod.rs +++ b/library/std/src/net/mod.rs @@ -70,7 +70,3 @@ pub enum Shutdown { #[stable(feature = "rust1", since = "1.0.0")] Both, } - -// allow(unused_imports): This function is only used on some targets -#[allow(unused_imports)] -pub(crate) use socket_addr::lookup_host_string; diff --git a/library/std/src/net/socket_addr.rs b/library/std/src/net/socket_addr.rs index fac570d72bccd..cae14e34e73e7 100644 --- a/library/std/src/net/socket_addr.rs +++ b/library/std/src/net/socket_addr.rs @@ -189,25 +189,6 @@ impl ToSocketAddrs for (Ipv6Addr, u16) { } } -// Default implementation, this shouldn't be called directly by the function's -// path in this module. Instead, use the platform-specific implementation -// (which may be this one). -// -// allow(dead_code): This function is only used on some targets -#[allow(dead_code)] -pub(crate) fn lookup_host_string(addr: &str) -> io::Result> { - // Split the string by ':' and convert the second part to u16... - let Some((host, port_str)) = addr.rsplit_once(':') else { - return Err(io::const_error!(io::ErrorKind::InvalidInput, "invalid socket address")); - }; - let Ok(port) = port_str.parse::() else { - return Err(io::const_error!(io::ErrorKind::InvalidInput, "invalid port value")); - }; - - // ... and make the system look up the host. - crate::sys::net::lookup_host(host, port) -} - #[stable(feature = "rust1", since = "1.0.0")] impl ToSocketAddrs for (&str, u16) { type Iter = vec::IntoIter; diff --git a/library/std/src/sys/net/connection/mod.rs b/library/std/src/sys/net/connection/mod.rs index 2f064914a8317..84b53fd375c93 100644 --- a/library/std/src/sys/net/connection/mod.rs +++ b/library/std/src/sys/net/connection/mod.rs @@ -59,3 +59,22 @@ where None => Err(Error::NO_ADDRESSES), } } + +// Default implementation, may be overridden by platform-specific implementations. +#[cfg(not(all(target_vendor = "fortanix", target_env = "sgx")))] +pub(crate) fn lookup_host_string( + addr: &str, +) -> crate::io::Result> { + use crate::io; + + // Split the string by ':' and convert the second part to u16... + let Some((host, port_str)) = addr.rsplit_once(':') else { + return Err(io::const_error!(io::ErrorKind::InvalidInput, "invalid socket address")); + }; + let Ok(port) = port_str.parse::() else { + return Err(io::const_error!(io::ErrorKind::InvalidInput, "invalid port value")); + }; + + // ... and make the system look up the host. + crate::sys::net::lookup_host(host, port) +} diff --git a/library/std/src/sys/net/connection/motor.rs b/library/std/src/sys/net/connection/motor.rs index 8555291adc3c4..79a528792106c 100644 --- a/library/std/src/sys/net/connection/motor.rs +++ b/library/std/src/sys/net/connection/motor.rs @@ -395,8 +395,6 @@ pub struct LookupHost { addresses: alloc::collections::VecDeque, } -pub(crate) use crate::net::lookup_host_string; - pub fn lookup_host(host: &str, port: u16) -> io::Result { let (_port, addresses) = moto_rt::net::lookup_host(host, port).map_err(map_motor_error)?; Ok(LookupHost { addresses }) diff --git a/library/std/src/sys/net/connection/sgx.rs b/library/std/src/sys/net/connection/sgx.rs index 6ecb0a69a027b..a637a83663fc3 100644 --- a/library/std/src/sys/net/connection/sgx.rs +++ b/library/std/src/sys/net/connection/sgx.rs @@ -506,7 +506,7 @@ impl Iterator for LookupHost { } } -pub fn lookup_host_string(addr: impl Into) -> io::Result { +pub(crate) fn lookup_host_string(addr: impl Into) -> io::Result { Err(io::Error::new(io::ErrorKind::Uncategorized, NonIpSockAddr { host: addr.into() })) } diff --git a/library/std/src/sys/net/connection/socket/mod.rs b/library/std/src/sys/net/connection/socket/mod.rs index 54595b5a895e0..256b99dfa9874 100644 --- a/library/std/src/sys/net/connection/socket/mod.rs +++ b/library/std/src/sys/net/connection/socket/mod.rs @@ -340,8 +340,6 @@ impl Drop for LookupHost { } } -pub(crate) use crate::net::lookup_host_string; - pub fn lookup_host(host: &str, port: u16) -> io::Result { init(); run_with_cstr(host.as_bytes(), &|c_host| { diff --git a/library/std/src/sys/net/connection/uefi/mod.rs b/library/std/src/sys/net/connection/uefi/mod.rs index 299460572a87d..107a3e23733de 100644 --- a/library/std/src/sys/net/connection/uefi/mod.rs +++ b/library/std/src/sys/net/connection/uefi/mod.rs @@ -345,8 +345,6 @@ impl Iterator for LookupHost { } } -pub(crate) use crate::net::lookup_host_string; - pub fn lookup_host(_host: &str, _port: u16) -> io::Result { unsupported() } diff --git a/library/std/src/sys/net/connection/unsupported.rs b/library/std/src/sys/net/connection/unsupported.rs index 7089e17a7beda..fb18e8dec557c 100644 --- a/library/std/src/sys/net/connection/unsupported.rs +++ b/library/std/src/sys/net/connection/unsupported.rs @@ -311,8 +311,6 @@ impl Iterator for LookupHost { } } -pub(crate) use crate::net::lookup_host_string; - pub fn lookup_host(_host: &str, _port: u16) -> io::Result { unsupported() } diff --git a/library/std/src/sys/net/connection/wasip1.rs b/library/std/src/sys/net/connection/wasip1.rs index 1ef12e5ec4cf1..95a4ab2fbf0fd 100644 --- a/library/std/src/sys/net/connection/wasip1.rs +++ b/library/std/src/sys/net/connection/wasip1.rs @@ -483,8 +483,6 @@ impl Iterator for LookupHost { } } -pub(crate) use crate::net::lookup_host_string; - pub fn lookup_host(_host: &str, _port: u16) -> io::Result { unsupported() } diff --git a/library/std/src/sys/net/connection/xous/mod.rs b/library/std/src/sys/net/connection/xous/mod.rs index f3fd83a10f2c6..0f77be5c3fac8 100644 --- a/library/std/src/sys/net/connection/xous/mod.rs +++ b/library/std/src/sys/net/connection/xous/mod.rs @@ -46,5 +46,3 @@ pub struct GetAddress { } pub use dns::lookup_host; - -pub(crate) use crate::net::lookup_host_string;