diff --git a/README.md b/README.md index 091d1d90c..fb567dd6a 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Make sure you activated the full features of the tokio crate on Cargo.toml: ```toml [dependencies] -tokio = { version = "1.39.2", features = ["full"] } +tokio = { version = "1.39.3", features = ["full"] } ``` Then, on your main.rs: diff --git a/tokio/CHANGELOG.md b/tokio/CHANGELOG.md index f593cb333..4082b1b93 100644 --- a/tokio/CHANGELOG.md +++ b/tokio/CHANGELOG.md @@ -1,3 +1,10 @@ +# 1.39.3 (August 17th, 2024) + +This release fixes a regression where the unix socket api stopped accepting +the abstract socket namespace. ([#6772]) + +[#6772]: https://github.com/tokio-rs/tokio/pull/6772 + # 1.39.2 (July 27th, 2024) This release fixes a regression where the `select!` macro stopped accepting diff --git a/tokio/Cargo.toml b/tokio/Cargo.toml index 12a8c6985..37dd5e7b7 100644 --- a/tokio/Cargo.toml +++ b/tokio/Cargo.toml @@ -6,7 +6,7 @@ name = "tokio" # - README.md # - Update CHANGELOG.md. # - Create "v1.x.y" git tag. -version = "1.39.2" +version = "1.39.3" edition = "2021" rust-version = "1.70" authors = ["Tokio Contributors "] diff --git a/tokio/README.md b/tokio/README.md index 091d1d90c..fb567dd6a 100644 --- a/tokio/README.md +++ b/tokio/README.md @@ -56,7 +56,7 @@ Make sure you activated the full features of the tokio crate on Cargo.toml: ```toml [dependencies] -tokio = { version = "1.39.2", features = ["full"] } +tokio = { version = "1.39.3", features = ["full"] } ``` Then, on your main.rs: diff --git a/tokio/src/net/unix/listener.rs b/tokio/src/net/unix/listener.rs index 79b554ee1..5b28dc03f 100644 --- a/tokio/src/net/unix/listener.rs +++ b/tokio/src/net/unix/listener.rs @@ -3,8 +3,14 @@ use crate::net::unix::{SocketAddr, UnixStream}; use std::fmt; use std::io; +#[cfg(target_os = "android")] +use std::os::android::net::SocketAddrExt; +#[cfg(target_os = "linux")] +use std::os::linux::net::SocketAddrExt; +#[cfg(any(target_os = "linux", target_os = "android"))] +use std::os::unix::ffi::OsStrExt; use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, RawFd}; -use std::os::unix::net; +use std::os::unix::net::{self, SocketAddr as StdSocketAddr}; use std::path::Path; use std::task::{Context, Poll}; @@ -70,7 +76,20 @@ impl UnixListener { where P: AsRef, { - let listener = mio::net::UnixListener::bind(path)?; + // For now, we handle abstract socket paths on linux here. + #[cfg(any(target_os = "linux", target_os = "android"))] + let addr = { + let os_str_bytes = path.as_ref().as_os_str().as_bytes(); + if os_str_bytes.starts_with(b"\0") { + StdSocketAddr::from_abstract_name(os_str_bytes)? + } else { + StdSocketAddr::from_pathname(path)? + } + }; + #[cfg(not(any(target_os = "linux", target_os = "android")))] + let addr = StdSocketAddr::from_pathname(path)?; + + let listener = mio::net::UnixListener::bind_addr(&addr)?; let io = PollEvented::new(listener)?; Ok(UnixListener { io }) } diff --git a/tokio/src/net/unix/stream.rs b/tokio/src/net/unix/stream.rs index 60d581396..a8b6479f1 100644 --- a/tokio/src/net/unix/stream.rs +++ b/tokio/src/net/unix/stream.rs @@ -8,8 +8,14 @@ use crate::net::unix::SocketAddr; use std::fmt; use std::io::{self, Read, Write}; use std::net::Shutdown; +#[cfg(target_os = "android")] +use std::os::android::net::SocketAddrExt; +#[cfg(target_os = "linux")] +use std::os::linux::net::SocketAddrExt; +#[cfg(any(target_os = "linux", target_os = "android"))] +use std::os::unix::ffi::OsStrExt; use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, RawFd}; -use std::os::unix::net; +use std::os::unix::net::{self, SocketAddr as StdSocketAddr}; use std::path::Path; use std::pin::Pin; use std::task::{Context, Poll}; @@ -66,7 +72,20 @@ impl UnixStream { where P: AsRef, { - let stream = mio::net::UnixStream::connect(path)?; + // On linux, abstract socket paths need to be considered. + #[cfg(any(target_os = "linux", target_os = "android"))] + let addr = { + let os_str_bytes = path.as_ref().as_os_str().as_bytes(); + if os_str_bytes.starts_with(b"\0") { + StdSocketAddr::from_abstract_name(os_str_bytes)? + } else { + StdSocketAddr::from_pathname(path)? + } + }; + #[cfg(not(any(target_os = "linux", target_os = "android")))] + let addr = StdSocketAddr::from_pathname(path)?; + + let stream = mio::net::UnixStream::connect_addr(&addr)?; let stream = UnixStream::new(stream)?; poll_fn(|cx| stream.io.registration().poll_write_ready(cx)).await?; diff --git a/tokio/tests/uds_stream.rs b/tokio/tests/uds_stream.rs index cb40cbd18..626a96fa3 100644 --- a/tokio/tests/uds_stream.rs +++ b/tokio/tests/uds_stream.rs @@ -420,3 +420,16 @@ async fn epollhup() -> io::Result<()> { ); Ok(()) } + +// test for https://github.com/tokio-rs/tokio/issues/6767 +#[tokio::test] +#[cfg(any(target_os = "linux", target_os = "android"))] +async fn abstract_socket_name() { + let socket_path = "\0aaa"; + let listener = UnixListener::bind(socket_path).unwrap(); + + let accept = listener.accept(); + let connect = UnixStream::connect(&socket_path); + + try_join(accept, connect).await.unwrap(); +}