@@ -59,6 +59,30 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
59
59
}
60
60
61
61
unsafe fn sanitize_standard_fds ( ) {
62
+ #[ allow( dead_code) ]
63
+ let mut opened_devnull = -1 ;
64
+ #[ allow( dead_code) ]
65
+ let mut open_devnull = || {
66
+ #[ cfg( not( all( target_os = "linux" , target_env = "gnu" ) ) ) ]
67
+ use libc:: open;
68
+ #[ cfg( all( target_os = "linux" , target_env = "gnu" ) ) ]
69
+ use libc:: open64 as open;
70
+
71
+ if opened_devnull != -1 {
72
+ if libc:: dup ( opened_devnull) != -1 {
73
+ return ;
74
+ }
75
+ }
76
+ opened_devnull = open ( 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
+ } ;
85
+
62
86
// fast path with a single syscall for systems with poll()
63
87
#[ cfg( not( any(
64
88
miri,
@@ -74,11 +98,6 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
74
98
target_vendor = "apple" ,
75
99
) ) ) ]
76
100
' poll: {
77
- #[ cfg( not( all( target_os = "linux" , target_env = "gnu" ) ) ) ]
78
- use libc:: open as open64;
79
- #[ cfg( all( target_os = "linux" , target_env = "gnu" ) ) ]
80
- use libc:: open64;
81
-
82
101
use crate :: sys:: os:: errno;
83
102
let pfds: & mut [ _ ] = & mut [
84
103
libc:: pollfd { fd : 0 , events : 0 , revents : 0 } ,
@@ -106,13 +125,7 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
106
125
if pfd. revents & libc:: POLLNVAL == 0 {
107
126
continue ;
108
127
}
109
- if open64 ( c"/dev/null" . as_ptr ( ) , libc:: O_RDWR , 0 ) == -1 {
110
- // If the stream is closed but we failed to reopen it, abort the
111
- // process. Otherwise we wouldn't preserve the safety of
112
- // operations on the corresponding Rust object Stdin, Stdout, or
113
- // Stderr.
114
- libc:: abort ( ) ;
115
- }
128
+ open_devnull ( ) ;
116
129
}
117
130
return ;
118
131
}
@@ -129,21 +142,10 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
129
142
target_os = "vita" ,
130
143
) ) ) ]
131
144
{
132
- #[ cfg( not( all( target_os = "linux" , target_env = "gnu" ) ) ) ]
133
- use libc:: open as open64;
134
- #[ cfg( all( target_os = "linux" , target_env = "gnu" ) ) ]
135
- use libc:: open64;
136
-
137
145
use crate :: sys:: os:: errno;
138
146
for fd in 0 ..3 {
139
147
if libc:: fcntl ( fd, libc:: F_GETFD ) == -1 && errno ( ) == libc:: EBADF {
140
- if open64 ( c"/dev/null" . as_ptr ( ) , libc:: O_RDWR , 0 ) == -1 {
141
- // If the stream is closed but we failed to reopen it, abort the
142
- // process. Otherwise we wouldn't preserve the safety of
143
- // operations on the corresponding Rust object Stdin, Stdout, or
144
- // Stderr.
145
- libc:: abort ( ) ;
146
- }
148
+ open_devnull ( ) ;
147
149
}
148
150
}
149
151
}
0 commit comments