about summary refs log tree commit diff
path: root/library/std/src
diff options
context:
space:
mode:
authorFabian Wolff <fabian.wolff@alumni.ethz.ch>2021-09-10 19:36:51 +0200
committerFabian Wolff <fabian.wolff@alumni.ethz.ch>2021-09-10 21:02:41 +0200
commitf1c8accf90d797ef32a56ee08ed7705a4b500c17 (patch)
tree7e951973cc8e28ec319df3fc1c2a1855e6eaf2f7 /library/std/src
parent497ee321af3b8496eaccd7af7b437f18bab81abf (diff)
downloadrust-f1c8accf90d797ef32a56ee08ed7705a4b500c17.tar.gz
rust-f1c8accf90d797ef32a56ee08ed7705a4b500c17.zip
Use `libc::sigaction()` instead of `sys::signal()` to prevent a deadlock
Diffstat (limited to 'library/std/src')
-rw-r--r--library/std/src/sys/unix/process/process_unix.rs7
1 files changed, 3 insertions, 4 deletions
diff --git a/library/std/src/sys/unix/process/process_unix.rs b/library/std/src/sys/unix/process/process_unix.rs
index 12edf04a4e2..13b384d8899 100644
--- a/library/std/src/sys/unix/process/process_unix.rs
+++ b/library/std/src/sys/unix/process/process_unix.rs
@@ -333,10 +333,9 @@ impl Command {
             let mut set = MaybeUninit::<libc::sigset_t>::uninit();
             cvt(sigemptyset(set.as_mut_ptr()))?;
             cvt(libc::pthread_sigmask(libc::SIG_SETMASK, set.as_ptr(), ptr::null_mut()))?;
-            let ret = sys::signal(libc::SIGPIPE, libc::SIG_DFL);
-            if ret == libc::SIG_ERR {
-                return Err(io::Error::last_os_error());
-            }
+            let mut action: libc::sigaction = mem::zeroed();
+            action.sa_sigaction = libc::SIG_DFL;
+            cvt(libc::sigaction(libc::SIGPIPE, &action as *const _, ptr::null_mut()))?;
         }
 
         for callback in self.get_closures().iter_mut() {