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