From 76b27ae298e991373116596f2efb68a61919c7fd Mon Sep 17 00:00:00 2001 From: Steve Lau Date: Sun, 2 Feb 2025 20:14:39 +0800 Subject: [PATCH 1/2] fix: posix_spawn returns errno when on error, not -1 --- src/spawn.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/spawn.rs b/src/spawn.rs index eeb9b7871d..bd8858a922 100644 --- a/src/spawn.rs +++ b/src/spawn.rs @@ -370,7 +370,7 @@ pub fn posix_spawn, SE: AsRef>( ) -> Result { let mut pid = 0; - let res = unsafe { + let ret = unsafe { let args_p = to_exec_array(args); let env_p = to_exec_array(envp); @@ -384,7 +384,10 @@ pub fn posix_spawn, SE: AsRef>( ) }; - Errno::result(res)?; + if ret != 0 { + return Err(Errno::from_raw(ret)); + } + Ok(Pid::from_raw(pid)) } @@ -399,7 +402,7 @@ pub fn posix_spawnp, SE: AsRef>( ) -> Result { let mut pid = 0; - let res = unsafe { + let ret = unsafe { let args_p = to_exec_array(args); let env_p = to_exec_array(envp); @@ -413,6 +416,9 @@ pub fn posix_spawnp, SE: AsRef>( ) }; - Errno::result(res)?; + if ret != 0 { + return Err(Errno::from_raw(ret)); + } + Ok(Pid::from_raw(pid)) } From 295dfef7705a63290e68d5a70dabb696993215fc Mon Sep 17 00:00:00 2001 From: Steve Lau Date: Sun, 2 Feb 2025 20:24:53 +0800 Subject: [PATCH 2/2] test: acquire the FORK_MTX lock in posix_spawn tests --- test/test_spawn.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/test_spawn.rs b/test/test_spawn.rs index 1283c96ca8..58dfec31e6 100644 --- a/test/test_spawn.rs +++ b/test/test_spawn.rs @@ -1,11 +1,13 @@ -use std::ffi::CString; - +use super::FORK_MTX; use nix::spawn::{self, PosixSpawnAttr, PosixSpawnFileActions}; use nix::sys::signal; use nix::sys::wait::{waitpid, WaitPidFlag, WaitStatus}; +use std::ffi::CString; #[test] fn spawn_true() { + let _guard = FORK_MTX.lock(); + let bin = &CString::new("true").unwrap(); let args = &[ CString::new("true").unwrap(), @@ -32,6 +34,8 @@ fn spawn_true() { #[test] fn spawn_sleep() { + let _guard = FORK_MTX.lock(); + let bin = &CString::new("sleep").unwrap(); let args = &[CString::new("sleep").unwrap(), CString::new("30").unwrap()]; let vars: &[CString] = &[];