Skip to content

Commit a99fb78

Browse files
authored
Rollup merge of #77288 - RalfJung:miri-macos, r=Amanieu
fix building libstd for Miri on macOS Fixes a Miri regression introduced by #75295 Cc @tmiasko @Amanieu
2 parents a9a364f + dc8414b commit a99fb78

File tree

1 file changed

+50
-49
lines changed
  • library/std/src/sys/unix

1 file changed

+50
-49
lines changed

library/std/src/sys/unix/mod.rs

+50-49
Original file line numberDiff line numberDiff line change
@@ -93,60 +93,61 @@ pub fn init() {
9393
reset_sigpipe();
9494
}
9595

96-
// In the case when all file descriptors are open, the poll has been
97-
// observed to perform better than fcntl (on GNU/Linux).
98-
#[cfg(not(any(
99-
miri,
100-
target_os = "emscripten",
101-
target_os = "fuchsia",
102-
// The poll on Darwin doesn't set POLLNVAL for closed fds.
103-
target_os = "macos",
104-
target_os = "ios",
105-
target_os = "redox",
106-
)))]
107-
unsafe fn sanitize_standard_fds() {
108-
use crate::sys::os::errno;
109-
let pfds: &mut [_] = &mut [
110-
libc::pollfd { fd: 0, events: 0, revents: 0 },
111-
libc::pollfd { fd: 1, events: 0, revents: 0 },
112-
libc::pollfd { fd: 2, events: 0, revents: 0 },
113-
];
114-
while libc::poll(pfds.as_mut_ptr(), 3, 0) == -1 {
115-
if errno() == libc::EINTR {
116-
continue;
117-
}
118-
libc::abort();
119-
}
120-
for pfd in pfds {
121-
if pfd.revents & libc::POLLNVAL == 0 {
122-
continue;
123-
}
124-
if libc::open("/dev/null\0".as_ptr().cast(), libc::O_RDWR, 0) == -1 {
125-
// If the stream is closed but we failed to reopen it, abort the
126-
// process. Otherwise we wouldn't preserve the safety of
127-
// operations on the corresponding Rust object Stdin, Stdout, or
128-
// Stderr.
129-
libc::abort();
130-
}
131-
}
132-
}
133-
#[cfg(any(target_os = "macos", target_os = "ios", target_os = "redox"))]
134-
unsafe fn sanitize_standard_fds() {
135-
use crate::sys::os::errno;
136-
for fd in 0..3 {
137-
if libc::fcntl(fd, libc::F_GETFD) == -1 && errno() == libc::EBADF {
138-
if libc::open("/dev/null\0".as_ptr().cast(), libc::O_RDWR, 0) == -1 {
96+
cfg_if::cfg_if! {
97+
if #[cfg(miri)] {
98+
// The standard fds are always available in Miri.
99+
unsafe fn sanitize_standard_fds() {}
100+
} else if #[cfg(not(any(
101+
target_os = "emscripten",
102+
target_os = "fuchsia",
103+
// The poll on Darwin doesn't set POLLNVAL for closed fds.
104+
target_os = "macos",
105+
target_os = "ios",
106+
target_os = "redox",
107+
)))] {
108+
// In the case when all file descriptors are open, the poll has been
109+
// observed to perform better than fcntl (on GNU/Linux).
110+
unsafe fn sanitize_standard_fds() {
111+
use crate::sys::os::errno;
112+
let pfds: &mut [_] = &mut [
113+
libc::pollfd { fd: 0, events: 0, revents: 0 },
114+
libc::pollfd { fd: 1, events: 0, revents: 0 },
115+
libc::pollfd { fd: 2, events: 0, revents: 0 },
116+
];
117+
while libc::poll(pfds.as_mut_ptr(), 3, 0) == -1 {
118+
if errno() == libc::EINTR {
119+
continue;
120+
}
139121
libc::abort();
140122
}
123+
for pfd in pfds {
124+
if pfd.revents & libc::POLLNVAL == 0 {
125+
continue;
126+
}
127+
if libc::open("/dev/null\0".as_ptr().cast(), libc::O_RDWR, 0) == -1 {
128+
// If the stream is closed but we failed to reopen it, abort the
129+
// process. Otherwise we wouldn't preserve the safety of
130+
// operations on the corresponding Rust object Stdin, Stdout, or
131+
// Stderr.
132+
libc::abort();
133+
}
134+
}
135+
}
136+
} else if #[cfg(any(target_os = "macos", target_os = "ios", target_os = "redox"))] {
137+
unsafe fn sanitize_standard_fds() {
138+
use crate::sys::os::errno;
139+
for fd in 0..3 {
140+
if libc::fcntl(fd, libc::F_GETFD) == -1 && errno() == libc::EBADF {
141+
if libc::open("/dev/null\0".as_ptr().cast(), libc::O_RDWR, 0) == -1 {
142+
libc::abort();
143+
}
144+
}
145+
}
141146
}
147+
} else {
148+
unsafe fn sanitize_standard_fds() {}
142149
}
143150
}
144-
#[cfg(any(
145-
// The standard fds are always available in Miri.
146-
miri,
147-
target_os = "emscripten",
148-
target_os = "fuchsia"))]
149-
unsafe fn sanitize_standard_fds() {}
150151

151152
#[cfg(not(any(target_os = "emscripten", target_os = "fuchsia")))]
152153
unsafe fn reset_sigpipe() {

0 commit comments

Comments
 (0)