Skip to content

Commit

Permalink
Check for errors returned from posix_spawn*_init functions
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
tmiasko committed Oct 8, 2020
1 parent 5faf25b commit 6cd5506
Showing 1 changed file with 10 additions and 8 deletions.
18 changes: 10 additions & 8 deletions library/std/src/sys/unix/process/process_unix.rs
Expand Up @@ -319,19 +319,19 @@ impl Command {

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

struct PosixSpawnFileActions(MaybeUninit<libc::posix_spawn_file_actions_t>);
struct PosixSpawnFileActions<'a>(&'a mut MaybeUninit<libc::posix_spawn_file_actions_t>);

impl Drop for PosixSpawnFileActions {
impl Drop for PosixSpawnFileActions<'_> {
fn drop(&mut self) {
unsafe {
libc::posix_spawn_file_actions_destroy(self.0.as_mut_ptr());
}
}
}

struct PosixSpawnattr(MaybeUninit<libc::posix_spawnattr_t>);
struct PosixSpawnattr<'a>(&'a mut MaybeUninit<libc::posix_spawnattr_t>);

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

unsafe {
let mut file_actions = PosixSpawnFileActions(MaybeUninit::uninit());
let mut attrs = PosixSpawnattr(MaybeUninit::uninit());
let mut attrs = MaybeUninit::uninit();
cvt_nz(libc::posix_spawnattr_init(attrs.as_mut_ptr()))?;
let attrs = PosixSpawnattr(&mut attrs);

libc::posix_spawnattr_init(attrs.0.as_mut_ptr());
libc::posix_spawn_file_actions_init(file_actions.0.as_mut_ptr());
let mut file_actions = MaybeUninit::uninit();
cvt_nz(libc::posix_spawn_file_actions_init(file_actions.as_mut_ptr()))?;
let file_actions = PosixSpawnFileActions(&mut file_actions);

if let Some(fd) = stdio.stdin.fd() {
cvt_nz(libc::posix_spawn_file_actions_adddup2(
Expand Down

0 comments on commit 6cd5506

Please sign in to comment.