@@ -59,6 +59,30 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
5959 }
6060
6161 unsafe fn sanitize_standard_fds ( ) {
62+ #[ allow( dead_code, unused_variables, unused_mut) ]
63+ let mut opened_devnull = -1 ;
64+ #[ allow( dead_code, unused_variables, unused_mut) ]
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+
6286 // fast path with a single syscall for systems with poll()
6387 #[ cfg( not( any(
6488 miri,
@@ -74,11 +98,6 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
7498 target_vendor = "apple" ,
7599 ) ) ) ]
76100 ' 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-
82101 use crate :: sys:: os:: errno;
83102 let pfds: & mut [ _ ] = & mut [
84103 libc:: pollfd { fd : 0 , events : 0 , revents : 0 } ,
@@ -106,13 +125,7 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
106125 if pfd. revents & libc:: POLLNVAL == 0 {
107126 continue ;
108127 }
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 ( ) ;
116129 }
117130 return ;
118131 }
@@ -129,21 +142,10 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
129142 target_os = "vita" ,
130143 ) ) ) ]
131144 {
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-
137145 use crate :: sys:: os:: errno;
138146 for fd in 0 ..3 {
139147 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 ( ) ;
147149 }
148150 }
149151 }
0 commit comments