about summary refs log tree commit diff
path: root/library/std/src/sys/net/connection/socket/solid.rs
diff options
context:
space:
mode:
authorjoboet <jonasboettiger@icloud.com>2025-02-07 18:34:09 +0100
committerjoboet <jonasboettiger@icloud.com>2025-02-12 14:13:35 +0100
commit80c60fe78375cb10a2fed6540dc2b29751fc4263 (patch)
tree207a56b85129112a5c9d217777bd8fca36a35526 /library/std/src/sys/net/connection/socket/solid.rs
parentc182ce9cbc8c29ebc1b4559d027df545e6cdd287 (diff)
downloadrust-80c60fe78375cb10a2fed6540dc2b29751fc4263.tar.gz
rust-80c60fe78375cb10a2fed6540dc2b29751fc4263.zip
std: replace the `FromInner` implementation for addresses with private conversion functions
Having these implementation available crate-wide means that platforms not using sockets for their networking code have to stub out the libc definitions required to support them. This PR moves the conversions to private helper functions that are only available where actually needed.

I also fixed the signature of the function converting from a C socket address to a Rust one: taking a reference to a `sockaddr_storage` resulted in unsound usage inside  `LookupHost::next`, which could create a reference to a structure smaller than `sockaddr_storage`. Thus I've replaced the argument type with a pointer and made the function `unsafe`.
Diffstat (limited to 'library/std/src/sys/net/connection/socket/solid.rs')
-rw-r--r--library/std/src/sys/net/connection/socket/solid.rs8
1 files changed, 4 insertions, 4 deletions
diff --git a/library/std/src/sys/net/connection/socket/solid.rs b/library/std/src/sys/net/connection/socket/solid.rs
index f85ecbb883e..906bef267b6 100644
--- a/library/std/src/sys/net/connection/socket/solid.rs
+++ b/library/std/src/sys/net/connection/socket/solid.rs
@@ -1,17 +1,17 @@
 use libc::{c_int, c_void, size_t};
 
 use self::netc::{MSG_PEEK, sockaddr, socklen_t};
+use super::{getsockopt, setsockopt, socket_addr_from_c, socket_addr_to_c};
 use crate::ffi::CStr;
 use crate::io::{self, BorrowedBuf, BorrowedCursor, ErrorKind, IoSlice, IoSliceMut};
 use crate::net::{Shutdown, SocketAddr};
 use crate::os::solid::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd};
 use crate::sys::abi;
-use crate::sys::net::{getsockopt, setsockopt, sockaddr_to_addr};
 use crate::sys_common::{FromInner, IntoInner};
 use crate::time::Duration;
 use crate::{cmp, mem, ptr, str};
 
-pub mod netc {
+pub(super) mod netc {
     pub use crate::sys::abi::sockets::*;
 }
 
@@ -131,7 +131,7 @@ impl Socket {
     }
 
     pub fn connect(&self, addr: &SocketAddr) -> io::Result<()> {
-        let (addr, len) = addr.into_inner();
+        let (addr, len) = socket_addr_to_c(addr);
         cvt(unsafe { netc::connect(self.as_raw_fd(), addr.as_ptr(), len) })?;
         Ok(())
     }
@@ -256,7 +256,7 @@ impl Socket {
                 &mut addrlen,
             )
         })?;
-        Ok((n as usize, sockaddr_to_addr(&storage, addrlen as usize)?))
+        Ok((n as usize, unsafe { socket_addr_from_c(&storage, addrlen as usize)? }))
     }
 
     pub fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {