1
1
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2
2
From: David Greaves <
[email protected] >
3
3
Date: Wed, 20 Jan 2021 09:40:34 +0000
4
- Subject: [PATCH] Provide ENV controls to bypass some sb2 calls between fork
5
- exec
4
+ Subject: [PATCH] Provide ENV controls to bypass some sb2 calls between
5
+ fork exec
6
6
7
7
In threaded systems there can be deadlocks caused by calling malloc
8
8
after fork and before exec. Rust manages this but sb2 does not.
@@ -35,15 +35,15 @@ needed to support the SHIM functionality
35
35
Signed-off-by: David Greaves <
[email protected] >
36
36
Signed-off-by: Ruben De Smet <
[email protected] >
37
37
---
38
- .../src/sys/unix/process/process_common.rs | 50 ++++++-
38
+ .../src/sys/unix/process/process_common.rs | 55 ++++++-
39
39
.../std/src/sys/unix/process/process_unix.rs | 138 ++++++++++++++++--
40
- 2 files changed, 170 insertions(+), 18 deletions(-)
40
+ 2 files changed, 173 insertions(+), 20 deletions(-)
41
41
42
42
diff --git a/library/std/src/sys/unix/process/process_common.rs b/library/std/src/sys/unix/process/process_common.rs
43
- index 27bee714f5b4317132db508fe916c7e194d05bc5..7746177e0423b7689833cc84b6132240a8bb2bf0 100644
43
+ index 640648e8707..f15625e0514 100644
44
44
--- a/library/std/src/sys/unix/process/process_common.rs
45
45
+++ b/library/std/src/sys/unix/process/process_common.rs
46
- @@ -61 ,7 +61 ,7 @@ cfg_if::cfg_if! {
46
+ @@ -84 ,7 +84 ,7 @@ pub unsafe fn sigaddset(set: *mut libc::sigset_t, signum: libc::c_int) -> libc::
47
47
////////////////////////////////////////////////////////////////////////////////
48
48
49
49
pub struct Command {
@@ -52,7 +52,7 @@ index 27bee714f5b4317132db508fe916c7e194d05bc5..7746177e0423b7689833cc84b6132240
52
52
args: Vec<CString>,
53
53
/// Exactly what will be passed to `execvp`.
54
54
///
55
- @@ -70 ,6 +70 ,13 @@ pub struct Command {
55
+ @@ -93 ,6 +93 ,13 @@ pub struct Command {
56
56
/// `args` to properly update this as well.
57
57
argv: Argv,
58
58
env: CommandEnv,
@@ -64,9 +64,9 @@ index 27bee714f5b4317132db508fe916c7e194d05bc5..7746177e0423b7689833cc84b6132240
64
64
+ pub(crate) setgid: Option<SetgidFn>,
65
65
+ pub(crate) setgroups: Option<SetgroupsFn>,
66
66
67
+ program_kind: ProgramKind,
67
68
cwd: Option<CString>,
68
- uid: Option<uid_t>,
69
- @@ -85,6 +92,14 @@ pub struct Command {
69
+ @@ -109,6 +116,14 @@ pub struct Command {
70
70
pgroup: Option<pid_t>,
71
71
}
72
72
@@ -81,18 +81,18 @@ index 27bee714f5b4317132db508fe916c7e194d05bc5..7746177e0423b7689833cc84b6132240
81
81
// Create a new type for argv, so that we can make it `Send` and `Sync`
82
82
struct Argv(Vec<*const c_char>);
83
83
84
- @@ -132,15 +147,23 @@ impl Command {
85
- pub fn new(program: &OsStr) -> Command {
84
+ @@ -181,16 +196,24 @@ pub fn new(program: &OsStr) -> Command {
86
85
let mut saw_nul = false;
86
+ let program_kind = ProgramKind::new(program.as_ref());
87
87
let program = os2c(program, &mut saw_nul);
88
88
+ let arg0 = program.clone();
89
89
Command {
90
90
- argv: Argv(vec![program.as_ptr(), ptr::null()]),
91
91
- args: vec![program.clone()],
92
- - program,
93
92
+ argv: Argv(vec![arg0.as_ptr(), ptr::null()]),
94
93
+ args: vec![arg0],
95
- + program: program,
94
+ program,
95
+ program_kind,
96
96
env: Default::default(),
97
97
+ execvp: None,
98
98
+ dup2: None,
@@ -109,18 +109,18 @@ index 27bee714f5b4317132db508fe916c7e194d05bc5..7746177e0423b7689833cc84b6132240
109
109
closures: Vec::new(),
110
110
groups: None,
111
111
stdin: None,
112
- @@ -154,15 +177,23 @@ impl Command {
113
- pub fn new(program: &OsStr) -> Command {
112
+ @@ -205,16 +228,24 @@ pub fn new(program: &OsStr) -> Command {
114
113
let mut saw_nul = false;
114
+ let program_kind = ProgramKind::new(program.as_ref());
115
115
let program = os2c(program, &mut saw_nul);
116
116
+ let arg0 = program.clone();
117
117
Command {
118
118
- argv: Argv(vec![program.as_ptr(), ptr::null()]),
119
119
- args: vec![program.clone()],
120
- - program,
121
120
+ argv: Argv(vec![arg0.as_ptr(), ptr::null()]),
122
121
+ args: vec![arg0],
123
- + program: program,
122
+ program,
123
+ program_kind,
124
124
env: Default::default(),
125
125
+ execvp: None,
126
126
+ dup2: None,
@@ -137,7 +137,7 @@ index 27bee714f5b4317132db508fe916c7e194d05bc5..7746177e0423b7689833cc84b6132240
137
137
closures: Vec::new(),
138
138
groups: None,
139
139
stdin: None,
140
- @@ -173 ,6 +204 ,16 @@ impl Command {
140
+ @@ -225 ,6 +256 ,16 @@ pub fn new(program: &OsStr) -> Command {
141
141
}
142
142
}
143
143
@@ -155,18 +155,21 @@ index 27bee714f5b4317132db508fe916c7e194d05bc5..7746177e0423b7689833cc84b6132240
155
155
// Set a new arg0
156
156
let arg = os2c(arg, &mut self.saw_nul);
157
157
diff --git a/library/std/src/sys/unix/process/process_unix.rs b/library/std/src/sys/unix/process/process_unix.rs
158
- index 3d305cd7310fd4b8419d220d1adeadebb9fda914..5d1c667b943cb2af0e0e918c17a7b24293617376 100644
158
+ index 0ce93af66ac..04449d859bf 100644
159
159
--- a/library/std/src/sys/unix/process/process_unix.rs
160
160
+++ b/library/std/src/sys/unix/process/process_unix.rs
161
- @@ -27,11 +27,15 @@
161
+ @@ -28,7 +28,7 @@
162
162
use libc::RTP_ID as pid_t;
163
163
164
164
#[cfg(not(target_os = "vxworks"))]
165
165
- use libc::{c_int, pid_t};
166
166
+ use libc::{c_char, c_int, dlsym, pid_t};
167
167
168
- #[cfg(not(any(target_os = "vxworks", target_os = "l4re")))]
169
- use libc::{gid_t, uid_t};
168
+ #[cfg(not(any(
169
+ target_os = "vxworks",
170
+ @@ -65,6 +65,10 @@ fn get_clock_resolution() -> Duration {
171
+ }
172
+ }
170
173
171
174
+ use crate::ffi::OsString;
172
175
+ use crate::intrinsics::transmute;
@@ -175,8 +178,8 @@ index 3d305cd7310fd4b8419d220d1adeadebb9fda914..5d1c667b943cb2af0e0e918c17a7b242
175
178
////////////////////////////////////////////////////////////////////////////////
176
179
// Command
177
180
////////////////////////////////////////////////////////////////////////////////
178
- @@ -61 ,6 +65 ,65 @@ pub fn spawn(
179
-
181
+ @@ -93 ,6 +97 ,65 @@ pub fn spawn(
182
+ }
180
183
let (input, output) = sys::pipe::anon_pipe()?;
181
184
182
185
+ // If there is a RUST_EXEC_SHIM (could be "/usr/bin/env --")
@@ -241,16 +244,16 @@ index 3d305cd7310fd4b8419d220d1adeadebb9fda914..5d1c667b943cb2af0e0e918c17a7b242
241
244
// Whatever happens after the fork is almost for sure going to touch or
242
245
// look at the environment in one way or another (PATH in `execvp` or
243
246
// accessing the `environ` pointer ourselves). Make sure no other thread
244
- @@ -76 ,7 +139 ,7 @@ pub fn spawn(
247
+ @@ -109 ,7 +172 ,7 @@ pub fn spawn(
245
248
if pid == 0 {
246
249
crate::panic::always_abort();
247
- mem::forget(env_lock);
250
+ mem::forget(env_lock); // avoid non-async-signal-safe unlocking
248
251
- drop(input);
249
252
+ self.unwrap_drop(input);
250
253
let Err(err) = unsafe { self.do_exec(theirs, envp.as_ref()) };
251
254
let errno = err.raw_os_error().unwrap_or(libc::EINVAL) as u32;
252
255
let errno = errno.to_be_bytes();
253
- @@ -243 ,7 +306 ,48 @@ pub fn exec(&mut self, default: Stdio) -> io::Error {
256
+ @@ -336 ,7 +399 ,48 @@ pub fn exec(&mut self, default: Stdio) -> io::Error {
254
257
Err(e) => e,
255
258
}
256
259
}
@@ -300,7 +303,7 @@ index 3d305cd7310fd4b8419d220d1adeadebb9fda914..5d1c667b943cb2af0e0e918c17a7b242
300
303
// And at this point we've reached a special time in the life of the
301
304
// child. The child must now be considered hamstrung and unable to
302
305
// do anything other than syscalls really. Consider the following
303
- @@ -282 ,13 +386 ,13 @@ unsafe fn do_exec(
306
+ @@ -376 ,13 +480 ,13 @@ unsafe fn do_exec(
304
307
use crate::sys::{self, cvt_r};
305
308
306
309
if let Some(fd) = stdio.stdin.fd() {
@@ -317,7 +320,7 @@ index 3d305cd7310fd4b8419d220d1adeadebb9fda914..5d1c667b943cb2af0e0e918c17a7b242
317
320
}
318
321
319
322
#[cfg(not(target_os = "l4re"))]
320
- @@ -296 ,10 +400 ,10 @@ unsafe fn do_exec(
323
+ @@ -390 ,10 +494 ,10 @@ unsafe fn do_exec(
321
324
if let Some(_g) = self.get_groups() {
322
325
//FIXME: Redox kernel does not support setgroups yet
323
326
#[cfg(not(target_os = "redox"))]
@@ -330,12 +333,12 @@ index 3d305cd7310fd4b8419d220d1adeadebb9fda914..5d1c667b943cb2af0e0e918c17a7b242
330
333
}
331
334
if let Some(u) = self.get_uid() {
332
335
// When dropping privileges from root, the `setgroups` call
333
- @@ -311 ,13 +415 ,13 @@ unsafe fn do_exec(
336
+ @@ -405 ,13 +509 ,13 @@ unsafe fn do_exec(
334
337
//FIXME: Redox kernel does not support setgroups yet
335
338
#[cfg(not(target_os = "redox"))]
336
339
if libc::getuid() == 0 && self.get_groups().is_none() {
337
- - cvt(libc::setgroups(0, ptr::null()))?;
338
- + cvt(self.unwrap_setgroups(0, ptr::null()))?;
340
+ - cvt(libc::setgroups(0, crate:: ptr::null()))?;
341
+ + cvt(self.unwrap_setgroups(0, crate:: ptr::null()))?;
339
342
}
340
343
- cvt(libc::setuid(u as uid_t))?;
341
344
+ cvt(self.unwrap_setuid(u as uid_t))?;
@@ -347,7 +350,7 @@ index 3d305cd7310fd4b8419d220d1adeadebb9fda914..5d1c667b943cb2af0e0e918c17a7b242
347
350
}
348
351
349
352
if let Some(pgroup) = self.get_pgroup() {
350
- @@ -378 ,8 +482 ,12 @@ fn drop(&mut self) {
353
+ @@ -469 ,8 +573 ,12 @@ fn drop(&mut self) {
351
354
_reset = Some(Reset(*sys::os::environ()));
352
355
*sys::os::environ() = envp.as_ptr();
353
356
}
@@ -362,17 +365,17 @@ index 3d305cd7310fd4b8419d220d1adeadebb9fda914..5d1c667b943cb2af0e0e918c17a7b242
362
365
Err(io::Error::last_os_error())
363
366
}
364
367
365
- @@ -394 ,6 +502 ,7 @@ fn posix_spawn(
368
+ @@ -497 ,6 +605 ,7 @@ fn posix_spawn(
366
369
_: &ChildPipes,
367
370
_: Option<&CStringArray>,
368
371
) -> io::Result<Option<Process>> {
369
372
+ eprintln!("process_unix:270: in null posix_spawn");
370
373
Ok(None)
371
374
}
372
375
373
- @@ -413 ,12 +522 ,15 @@ fn posix_spawn(
376
+ @@ -520 ,12 +629 ,15 @@ fn posix_spawn(
374
377
use crate::mem::MaybeUninit;
375
- use crate::sys::{self, cvt_nz};
378
+ use crate::sys::{self, cvt_nz, unix_sigpipe_attr_specified };
376
379
377
380
+ let skip_spawnvp: bool = getenv(&OsString::from("SB2_RUST_NO_SPAWNVP")).is_some();
378
381
+
0 commit comments