Skip to content

Commit 0c40b8d

Browse files
authored
fix: posix_spawn returns errno on error, not -1 (#2595)
* fix: posix_spawn returns errno when on error, not -1 * test: acquire the FORK_MTX lock in posix_spawn tests
1 parent c2a7b25 commit 0c40b8d

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

src/spawn.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ pub fn posix_spawn<SA: AsRef<CStr>, SE: AsRef<CStr>>(
370370
) -> Result<Pid> {
371371
let mut pid = 0;
372372

373-
let res = unsafe {
373+
let ret = unsafe {
374374
let args_p = to_exec_array(args);
375375
let env_p = to_exec_array(envp);
376376

@@ -384,7 +384,10 @@ pub fn posix_spawn<SA: AsRef<CStr>, SE: AsRef<CStr>>(
384384
)
385385
};
386386

387-
Errno::result(res)?;
387+
if ret != 0 {
388+
return Err(Errno::from_raw(ret));
389+
}
390+
388391
Ok(Pid::from_raw(pid))
389392
}
390393

@@ -399,7 +402,7 @@ pub fn posix_spawnp<SA: AsRef<CStr>, SE: AsRef<CStr>>(
399402
) -> Result<Pid> {
400403
let mut pid = 0;
401404

402-
let res = unsafe {
405+
let ret = unsafe {
403406
let args_p = to_exec_array(args);
404407
let env_p = to_exec_array(envp);
405408

@@ -413,6 +416,9 @@ pub fn posix_spawnp<SA: AsRef<CStr>, SE: AsRef<CStr>>(
413416
)
414417
};
415418

416-
Errno::result(res)?;
419+
if ret != 0 {
420+
return Err(Errno::from_raw(ret));
421+
}
422+
417423
Ok(Pid::from_raw(pid))
418424
}

test/test_spawn.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
use std::ffi::CString;
2-
1+
use super::FORK_MTX;
32
use nix::spawn::{self, PosixSpawnAttr, PosixSpawnFileActions};
43
use nix::sys::signal;
54
use nix::sys::wait::{waitpid, WaitPidFlag, WaitStatus};
5+
use std::ffi::CString;
66

77
#[test]
88
fn spawn_true() {
9+
let _guard = FORK_MTX.lock();
10+
911
let bin = &CString::new("true").unwrap();
1012
let args = &[
1113
CString::new("true").unwrap(),
@@ -32,6 +34,8 @@ fn spawn_true() {
3234

3335
#[test]
3436
fn spawn_sleep() {
37+
let _guard = FORK_MTX.lock();
38+
3539
let bin = &CString::new("sleep").unwrap();
3640
let args = &[CString::new("sleep").unwrap(), CString::new("30").unwrap()];
3741
let vars: &[CString] = &[];

0 commit comments

Comments
 (0)