From b9203336208378bedb39df124f2e8e64383ef4fc Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Sat, 16 May 2020 15:55:30 -0600 Subject: [PATCH] Apply `repr(transparent)` to several FFI types repr(transparent) is required in order to safely cast between an FFI type and its NewType. This commit applies that attribute to PollFd, EpollEvent, IpMembershipRequest, Ipv6MembershipRequest, TimeVal, and IoVec. Fixes #1241 --- CHANGELOG.md | 5 +++++ src/poll.rs | 2 +- src/sys/epoll.rs | 2 +- src/sys/socket/mod.rs | 4 ++-- src/sys/time.rs | 2 +- src/sys/uio.rs | 2 +- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e186d94630..2e0ec63206 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,11 @@ This project adheres to [Semantic Versioning](http://semver.org/). 16KB. (#[1198](https://github.com/nix-rust/nix/pull/1198)) - Fixed unaligned casting of `cmsg_data` to `af_alg_iv` (#[1206](https://github.com/nix-rust/nix/pull/1206)) - Fixed `readlink`/`readlinkat` when reading symlinks longer than `PATH_MAX` (#[1231](https://github.com/nix-rust/nix/pull/1231)) +- `PollFd`, `EpollEvent`, `IpMembershipRequest`, `Ipv6MembershipRequest`, + `TimeVal`, and `IoVec` are now `repr(transparent)`. This is required for + correctness's sake across all architectures and compilers, though now bugs + have been reported so far. + (#[1243](https://github.com/nix-rust/nix/pull/1243)) ### Removed diff --git a/src/poll.rs b/src/poll.rs index 15bafe2d64..fbdd09de1c 100644 --- a/src/poll.rs +++ b/src/poll.rs @@ -17,7 +17,7 @@ use errno::Errno; /// /// After a call to `poll` or `ppoll`, the events that occured can be /// retrieved by calling [`revents()`](#method.revents) on the `PollFd`. -#[repr(C)] +#[repr(transparent)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] pub struct PollFd { pollfd: libc::pollfd, diff --git a/src/sys/epoll.rs b/src/sys/epoll.rs index fef6f4e3ec..074a8451db 100644 --- a/src/sys/epoll.rs +++ b/src/sys/epoll.rs @@ -43,7 +43,7 @@ libc_bitflags!{ } #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] -#[repr(C)] +#[repr(transparent)] pub struct EpollEvent { event: libc::epoll_event, } diff --git a/src/sys/socket/mod.rs b/src/sys/socket/mod.rs index 1f627614f0..52768c9351 100644 --- a/src/sys/socket/mod.rs +++ b/src/sys/socket/mod.rs @@ -278,7 +278,7 @@ cfg_if! { /// Request for multicast socket operations /// /// This is a wrapper type around `ip_mreq`. -#[repr(C)] +#[repr(transparent)] #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct IpMembershipRequest(libc::ip_mreq); @@ -297,7 +297,7 @@ impl IpMembershipRequest { /// Request for ipv6 multicast socket operations /// /// This is a wrapper type around `ipv6_mreq`. -#[repr(C)] +#[repr(transparent)] #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct Ipv6MembershipRequest(libc::ipv6_mreq); diff --git a/src/sys/time.rs b/src/sys/time.rs index 06475001b9..51baa9e10f 100644 --- a/src/sys/time.rs +++ b/src/sys/time.rs @@ -245,7 +245,7 @@ impl fmt::Display for TimeSpec { -#[repr(C)] +#[repr(transparent)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] pub struct TimeVal(timeval); diff --git a/src/sys/uio.rs b/src/sys/uio.rs index d089084eed..7dfeff77e0 100644 --- a/src/sys/uio.rs +++ b/src/sys/uio.rs @@ -158,7 +158,7 @@ pub fn process_vm_readv(pid: ::unistd::Pid, local_iov: &[IoVec<&mut [u8]>], remo Errno::result(res).map(|r| r as usize) } -#[repr(C)] +#[repr(transparent)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] pub struct IoVec(libc::iovec, PhantomData);