Skip to content

Commit 6cd5506

Browse files
committed
Check for errors returned from posix_spawn*_init functions
The posix_spawnattr_init & posix_spawn_file_actions_init might fail, but their return code is not checked. Check for non-zero return code and destroy only succesfully initialized objects.
1 parent 5faf25b commit 6cd5506

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

library/std/src/sys/unix/process/process_unix.rs

+10-8
Original file line numberDiff line numberDiff line change
@@ -319,19 +319,19 @@ impl Command {
319319

320320
let mut p = Process { pid: 0, status: None };
321321

322-
struct PosixSpawnFileActions(MaybeUninit<libc::posix_spawn_file_actions_t>);
322+
struct PosixSpawnFileActions<'a>(&'a mut MaybeUninit<libc::posix_spawn_file_actions_t>);
323323

324-
impl Drop for PosixSpawnFileActions {
324+
impl Drop for PosixSpawnFileActions<'_> {
325325
fn drop(&mut self) {
326326
unsafe {
327327
libc::posix_spawn_file_actions_destroy(self.0.as_mut_ptr());
328328
}
329329
}
330330
}
331331

332-
struct PosixSpawnattr(MaybeUninit<libc::posix_spawnattr_t>);
332+
struct PosixSpawnattr<'a>(&'a mut MaybeUninit<libc::posix_spawnattr_t>);
333333

334-
impl Drop for PosixSpawnattr {
334+
impl Drop for PosixSpawnattr<'_> {
335335
fn drop(&mut self) {
336336
unsafe {
337337
libc::posix_spawnattr_destroy(self.0.as_mut_ptr());
@@ -344,11 +344,13 @@ impl Command {
344344
}
345345

346346
unsafe {
347-
let mut file_actions = PosixSpawnFileActions(MaybeUninit::uninit());
348-
let mut attrs = PosixSpawnattr(MaybeUninit::uninit());
347+
let mut attrs = MaybeUninit::uninit();
348+
cvt_nz(libc::posix_spawnattr_init(attrs.as_mut_ptr()))?;
349+
let attrs = PosixSpawnattr(&mut attrs);
349350

350-
libc::posix_spawnattr_init(attrs.0.as_mut_ptr());
351-
libc::posix_spawn_file_actions_init(file_actions.0.as_mut_ptr());
351+
let mut file_actions = MaybeUninit::uninit();
352+
cvt_nz(libc::posix_spawn_file_actions_init(file_actions.as_mut_ptr()))?;
353+
let file_actions = PosixSpawnFileActions(&mut file_actions);
352354

353355
if let Some(fd) = stdio.stdin.fd() {
354356
cvt_nz(libc::posix_spawn_file_actions_adddup2(

0 commit comments

Comments
 (0)