Skip to content

Commit

Permalink
Rely on libc for correct integer types in os/unix/net/ancillary.rs.
Browse files Browse the repository at this point in the history
  • Loading branch information
de-vri-es committed Jun 17, 2021
1 parent d192c80 commit 259bf5f
Showing 1 changed file with 10 additions and 100 deletions.
110 changes: 10 additions & 100 deletions library/std/src/os/unix/net/ancillary.rs
Expand Up @@ -32,23 +32,8 @@ pub(super) fn recv_vectored_with_ancillary_from(
msg.msg_name = &mut msg_name as *mut _ as *mut _;
msg.msg_namelen = size_of::<libc::sockaddr_un>() as libc::socklen_t;
msg.msg_iov = bufs.as_mut_ptr().cast();
cfg_if::cfg_if! {
if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
msg.msg_iovlen = bufs.len() as libc::size_t;
msg.msg_controllen = ancillary.buffer.len() as libc::size_t;
} else if #[cfg(any(
target_os = "dragonfly",
target_os = "emscripten",
target_os = "freebsd",
all(target_os = "linux", target_env = "musl",),
target_os = "macos",
target_os = "netbsd",
target_os = "openbsd",
))] {
msg.msg_iovlen = bufs.len() as libc::c_int;
msg.msg_controllen = ancillary.buffer.len() as libc::socklen_t;
}
}
msg.msg_iovlen = bufs.len() as _;
msg.msg_controllen = ancillary.buffer.len() as _;
// macos requires that the control pointer is null when the len is 0.
if msg.msg_controllen > 0 {
msg.msg_control = ancillary.buffer.as_mut_ptr().cast();
Expand Down Expand Up @@ -80,23 +65,8 @@ pub(super) fn send_vectored_with_ancillary_to(
msg.msg_name = &mut msg_name as *mut _ as *mut _;
msg.msg_namelen = msg_namelen;
msg.msg_iov = bufs.as_ptr() as *mut _;
cfg_if::cfg_if! {
if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
msg.msg_iovlen = bufs.len() as libc::size_t;
msg.msg_controllen = ancillary.length as libc::size_t;
} else if #[cfg(any(
target_os = "dragonfly",
target_os = "emscripten",
target_os = "freebsd",
all(target_os = "linux", target_env = "musl",),
target_os = "macos",
target_os = "netbsd",
target_os = "openbsd",
))] {
msg.msg_iovlen = bufs.len() as libc::c_int;
msg.msg_controllen = ancillary.length as libc::socklen_t;
}
}
msg.msg_iovlen = bufs.len() as _;
msg.msg_controllen = ancillary.length as _;
// macos requires that the control pointer is null when the len is 0.
if msg.msg_controllen > 0 {
msg.msg_control = ancillary.buffer.as_mut_ptr().cast();
Expand Down Expand Up @@ -144,21 +114,7 @@ fn add_to_ancillary_data<T>(

let mut msg: libc::msghdr = zeroed();
msg.msg_control = buffer.as_mut_ptr().cast();
cfg_if::cfg_if! {
if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
msg.msg_controllen = *length as libc::size_t;
} else if #[cfg(any(
target_os = "dragonfly",
target_os = "emscripten",
target_os = "freebsd",
all(target_os = "linux", target_env = "musl",),
target_os = "macos",
target_os = "netbsd",
target_os = "openbsd",
))] {
msg.msg_controllen = *length as libc::socklen_t;
}
}
msg.msg_controllen = *length as _;

let mut cmsg = libc::CMSG_FIRSTHDR(&msg);
let mut previous_cmsg = cmsg;
Expand All @@ -180,21 +136,7 @@ fn add_to_ancillary_data<T>(

(*previous_cmsg).cmsg_level = cmsg_level;
(*previous_cmsg).cmsg_type = cmsg_type;
cfg_if::cfg_if! {
if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
(*previous_cmsg).cmsg_len = libc::CMSG_LEN(source_len) as libc::size_t;
} else if #[cfg(any(
target_os = "dragonfly",
target_os = "emscripten",
target_os = "freebsd",
all(target_os = "linux", target_env = "musl",),
target_os = "macos",
target_os = "netbsd",
target_os = "openbsd",
))] {
(*previous_cmsg).cmsg_len = libc::CMSG_LEN(source_len) as libc::socklen_t;
}
}
(*previous_cmsg).cmsg_len = libc::CMSG_LEN(source_len) as _;

let data = libc::CMSG_DATA(previous_cmsg).cast();

Expand Down Expand Up @@ -364,28 +306,10 @@ impl<'a> AncillaryData<'a> {

fn try_from_cmsghdr(cmsg: &'a libc::cmsghdr) -> Result<Self, AncillaryError> {
unsafe {
cfg_if::cfg_if! {
if #[cfg(any(
target_os = "android",
all(target_os = "linux", target_env = "gnu"),
all(target_os = "linux", target_env = "uclibc"),
))] {
let cmsg_len_zero = libc::CMSG_LEN(0) as libc::size_t;
} else if #[cfg(any(
target_os = "dragonfly",
target_os = "emscripten",
target_os = "freebsd",
all(target_os = "linux", target_env = "musl",),
target_os = "macos",
target_os = "netbsd",
target_os = "openbsd",
))] {
let cmsg_len_zero = libc::CMSG_LEN(0) as libc::socklen_t;
}
}
let data_len = (*cmsg).cmsg_len - cmsg_len_zero;
let cmsg_len_zero = libc::CMSG_LEN(0) as usize;
let data_len = (*cmsg).cmsg_len as usize - cmsg_len_zero;
let data = libc::CMSG_DATA(cmsg).cast();
let data = from_raw_parts(data, data_len as usize);
let data = from_raw_parts(data, data_len);

match (*cmsg).cmsg_level {
libc::SOL_SOCKET => match (*cmsg).cmsg_type {
Expand Down Expand Up @@ -419,21 +343,7 @@ impl<'a> Iterator for Messages<'a> {
unsafe {
let mut msg: libc::msghdr = zeroed();
msg.msg_control = self.buffer.as_ptr() as *mut _;
cfg_if::cfg_if! {
if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] {
msg.msg_controllen = self.buffer.len() as libc::size_t;
} else if #[cfg(any(
target_os = "dragonfly",
target_os = "emscripten",
target_os = "freebsd",
all(target_os = "linux", target_env = "musl",),
target_os = "macos",
target_os = "netbsd",
target_os = "openbsd",
))] {
msg.msg_controllen = self.buffer.len() as libc::socklen_t;
}
}
msg.msg_controllen = self.buffer.len() as _;

let cmsg = if let Some(current) = self.current {
libc::CMSG_NXTHDR(&msg, current)
Expand Down

0 comments on commit 259bf5f

Please sign in to comment.