From 456baa0cc9a0212e821724a1004111f215940b34 Mon Sep 17 00:00:00 2001 From: Paul Daniel Faria Date: Wed, 20 Jan 2021 16:29:26 -0500 Subject: [PATCH 1/2] Fix file descriptor ranges for fuchsia Fuchsia does not restrict the range of valid values for a file descriptor, so the previous change that marked -1 as an invalid file descriptor does not apply to fuchsia. --- library/std/src/sys/unix/fd.rs | 9 ++++++--- library/std/src/sys/unix/fd/tests.rs | 11 ++++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/library/std/src/sys/unix/fd.rs b/library/std/src/sys/unix/fd.rs index 821851a6c65b7..dca48d35818ed 100644 --- a/library/std/src/sys/unix/fd.rs +++ b/library/std/src/sys/unix/fd.rs @@ -12,11 +12,11 @@ use crate::sys_common::AsInner; use libc::{c_int, c_void}; #[derive(Debug)] -#[rustc_layout_scalar_valid_range_start(0)] +#[cfg_attr(not(target_os = "fuchsia"), rustc_layout_scalar_valid_range_start(0))] // libstd/os/raw/mod.rs assures me that every libstd-supported platform has a // 32-bit c_int. Below is -2, in two's complement, but that only works out // because c_int is 32 bits. -#[rustc_layout_scalar_valid_range_end(0xFF_FF_FF_FE)] +#[cfg_attr(not(target_os = "fuchsia"), rustc_layout_scalar_valid_range_end(0xFF_FF_FF_FE))] pub struct FileDesc { fd: c_int, } @@ -68,7 +68,10 @@ const fn max_iov() -> usize { impl FileDesc { pub fn new(fd: c_int) -> FileDesc { - assert_ne!(fd, -1i32); + if cfg!(not(target_os = "fuchsia")) { + assert_ne!(fd, -1i32); + } + // SAFETY: we just asserted that the value is in the valid range and isn't `-1` (the only value bigger than `0xFF_FF_FF_FE` unsigned) unsafe { FileDesc { fd } } } diff --git a/library/std/src/sys/unix/fd/tests.rs b/library/std/src/sys/unix/fd/tests.rs index c9520485c3c7c..c1d5f38dda262 100644 --- a/library/std/src/sys/unix/fd/tests.rs +++ b/library/std/src/sys/unix/fd/tests.rs @@ -3,7 +3,16 @@ use core::mem::ManuallyDrop; #[test] fn limit_vector_count() { - let stdout = ManuallyDrop::new(unsafe { FileDesc { fd: 1 } }); + let stdout = ManuallyDrop::new( + #[cfg(not(target_os = "fuchsia"))] + { + unsafe { FileDesc { fd: 1 } } + }, + #[cfg(target_os = "fuchsia")] + { + FileDesc { fd: 1 } + }, + ); let bufs = (0..1500).map(|_| IoSlice::new(&[])).collect::>(); assert!(stdout.write_vectored(&bufs).is_ok()); } From a32610d2f39146191f393cb7d4925de78a37071a Mon Sep 17 00:00:00 2001 From: Paul Daniel Faria Date: Thu, 21 Jan 2021 09:48:36 -0500 Subject: [PATCH 2/2] Use cfg_attr to avoid repetition in fd test --- library/std/src/sys/unix/fd/tests.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/library/std/src/sys/unix/fd/tests.rs b/library/std/src/sys/unix/fd/tests.rs index c1d5f38dda262..e095ccc2ac083 100644 --- a/library/std/src/sys/unix/fd/tests.rs +++ b/library/std/src/sys/unix/fd/tests.rs @@ -4,12 +4,8 @@ use core::mem::ManuallyDrop; #[test] fn limit_vector_count() { let stdout = ManuallyDrop::new( - #[cfg(not(target_os = "fuchsia"))] - { - unsafe { FileDesc { fd: 1 } } - }, - #[cfg(target_os = "fuchsia")] - { + #[cfg_attr(target_os = "fuchsia", allow(unused_unsafe))] + unsafe { FileDesc { fd: 1 } }, );