Skip to content

Commit 9ab2897

Browse files
atrocious
1 parent 4983fda commit 9ab2897

File tree

1 file changed

+27
-22
lines changed
  • library/std/src/sys/pal/unix

1 file changed

+27
-22
lines changed

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

+27-22
Original file line numberDiff line numberDiff line change
@@ -61,27 +61,30 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
6161
}
6262

6363
unsafe fn sanitize_standard_fds() {
64-
let mut opened_devnull = -1;
65-
let mut open_devnull = || {
66-
#[cfg(not(all(target_os = "linux", target_env = "gnu")))]
67-
use libc::open as open64;
68-
#[cfg(all(target_os = "linux", target_env = "gnu"))]
69-
use libc::open64;
70-
71-
if opened_devnull != -1 {
72-
if libc::dup(opened_devnull) != -1 {
73-
return;
64+
macro_rules! open_devnull {
65+
($opened_devnull:expr) => {
66+
'od: {
67+
#[cfg(not(all(target_os = "linux", target_env = "gnu")))]
68+
use libc::open as open64;
69+
#[cfg(all(target_os = "linux", target_env = "gnu"))]
70+
use libc::open64;
71+
72+
if $opened_devnull != -1 {
73+
if libc::dup($opened_devnull) != -1 {
74+
break 'od;
75+
}
76+
}
77+
$opened_devnull = open64(c"/dev/null".as_ptr(), libc::O_RDWR, 0);
78+
if $opened_devnull == -1 {
79+
// If the stream is closed but we failed to reopen it, abort the
80+
// process. Otherwise we wouldn't preserve the safety of
81+
// operations on the corresponding Rust object Stdin, Stdout, or
82+
// Stderr.
83+
libc::abort();
84+
}
7485
}
75-
}
76-
opened_devnull = open64(c"/dev/null".as_ptr(), libc::O_RDWR, 0);
77-
if opened_devnull == -1 {
78-
// If the stream is closed but we failed to reopen it, abort the
79-
// process. Otherwise we wouldn't preserve the safety of
80-
// operations on the corresponding Rust object Stdin, Stdout, or
81-
// Stderr.
82-
libc::abort();
83-
}
84-
};
86+
};
87+
}
8588

8689
// fast path with a single syscall for systems with poll()
8790
#[cfg(not(any(
@@ -99,6 +102,7 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
99102
)))]
100103
'poll: {
101104
use crate::sys::os::errno;
105+
let mut opened_devnull = -1;
102106
let pfds: &mut [_] = &mut [
103107
libc::pollfd { fd: 0, events: 0, revents: 0 },
104108
libc::pollfd { fd: 1, events: 0, revents: 0 },
@@ -125,7 +129,7 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
125129
if pfd.revents & libc::POLLNVAL == 0 {
126130
continue;
127131
}
128-
open_devnull();
132+
open_devnull!(opened_devnull);
129133
}
130134
return;
131135
}
@@ -143,9 +147,10 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
143147
)))]
144148
{
145149
use crate::sys::os::errno;
150+
let mut opened_devnull = -1;
146151
for fd in 0..3 {
147152
if libc::fcntl(fd, libc::F_GETFD) == -1 && errno() == libc::EBADF {
148-
open_devnull();
153+
open_devnull!(opened_devnull);
149154
}
150155
}
151156
}

0 commit comments

Comments
 (0)