From 15c540d9fbd8b9f2580722b6a1bf97e8b13ee148 Mon Sep 17 00:00:00 2001 From: zonyitoo Date: Fri, 7 Jul 2023 00:28:04 +0800 Subject: [PATCH] fix buffer memory alignment fix #1239 backport from v1.16 --- crates/shadowsocks-service/src/manager/server.rs | 16 +++++++++++++--- crates/shadowsocks/src/relay/socks5.rs | 13 +++++-------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/crates/shadowsocks-service/src/manager/server.rs b/crates/shadowsocks-service/src/manager/server.rs index 9c77d27f..dcd50269 100644 --- a/crates/shadowsocks-service/src/manager/server.rs +++ b/crates/shadowsocks-service/src/manager/server.rs @@ -11,12 +11,22 @@ use shadowsocks::{ crypto::CipherKind, dns_resolver::DnsResolver, manager::protocol::{ - self, AddRequest, AddResponse, ErrorResponse, ListResponse, ManagerRequest, PingResponse, RemoveRequest, - RemoveResponse, ServerUserConfig, StatRequest, + self, + AddRequest, + AddResponse, + ErrorResponse, + ListResponse, + ManagerRequest, + PingResponse, + RemoveRequest, + RemoveResponse, + ServerUserConfig, + StatRequest, }, net::{AcceptOpts, ConnectOpts}, plugin::PluginConfig, - ManagerListener, ServerAddr, + ManagerListener, + ServerAddr, }; use tokio::{sync::Mutex, task::JoinHandle}; diff --git a/crates/shadowsocks/src/relay/socks5.rs b/crates/shadowsocks/src/relay/socks5.rs index e04c9802..7477f2fe 100644 --- a/crates/shadowsocks/src/relay/socks5.rs +++ b/crates/shadowsocks/src/relay/socks5.rs @@ -269,17 +269,14 @@ impl Address { let _ = stream.read_exact(&mut buf).await?; let v4addr = Ipv4Addr::new(buf[0], buf[1], buf[2], buf[3]); - let port = unsafe { - let raw_port = &buf[4..]; - u16::from_be(*(raw_port.as_ptr() as *const _)) - }; + let port = u16::from_be_bytes([buf[4], buf[5]]); Ok(Address::SocketAddress(SocketAddr::V4(SocketAddrV4::new(v4addr, port)))) } consts::SOCKS5_ADDR_TYPE_IPV6 => { - let mut buf = [0u8; 18]; - let _ = stream.read_exact(&mut buf).await?; + let mut buf = [0u16; 9]; - let buf: &[u16] = unsafe { slice::from_raw_parts(buf.as_ptr() as *const _, 9) }; + let bytes_buf = unsafe { slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut _, 18) }; + let _ = stream.read_exact(bytes_buf).await?; let v6addr = Ipv6Addr::new( u16::from_be(buf[0]), @@ -309,7 +306,7 @@ impl Address { let _ = stream.read_exact(&mut raw_addr).await?; let raw_port = &raw_addr[length..]; - let port = unsafe { u16::from_be(*(raw_port.as_ptr() as *const _)) }; + let port = u16::from_be_bytes([raw_port[0], raw_port[1]]); raw_addr.truncate(length);