Auto merge of #93530 - anonion0:pthread_sigmask_fix, r=JohnTitor
fix error handling for pthread_sigmask(3) Errors from `pthread_sigmask(3)` were handled using `cvt()`, which expects a return value of `-1` on error and uses `errno`. However, `pthread_sigmask(3)` returns `0` on success and an error number otherwise. Fix it by replacing `cvt()` with `cvt_nz()`.
This commit is contained in:
commit
e27d9df431
2 changed files with 5 additions and 4 deletions
|
@ -3,7 +3,7 @@ use super::*;
|
||||||
use crate::ffi::OsStr;
|
use crate::ffi::OsStr;
|
||||||
use crate::mem;
|
use crate::mem;
|
||||||
use crate::ptr;
|
use crate::ptr;
|
||||||
use crate::sys::cvt;
|
use crate::sys::{cvt, cvt_nz};
|
||||||
|
|
||||||
macro_rules! t {
|
macro_rules! t {
|
||||||
($e:expr) => {
|
($e:expr) => {
|
||||||
|
@ -39,7 +39,7 @@ fn test_process_mask() {
|
||||||
let mut old_set = mem::MaybeUninit::<libc::sigset_t>::uninit();
|
let mut old_set = mem::MaybeUninit::<libc::sigset_t>::uninit();
|
||||||
t!(cvt(sigemptyset(set.as_mut_ptr())));
|
t!(cvt(sigemptyset(set.as_mut_ptr())));
|
||||||
t!(cvt(sigaddset(set.as_mut_ptr(), libc::SIGINT)));
|
t!(cvt(sigaddset(set.as_mut_ptr(), libc::SIGINT)));
|
||||||
t!(cvt(libc::pthread_sigmask(libc::SIG_SETMASK, set.as_ptr(), old_set.as_mut_ptr())));
|
t!(cvt_nz(libc::pthread_sigmask(libc::SIG_SETMASK, set.as_ptr(), old_set.as_mut_ptr())));
|
||||||
|
|
||||||
cmd.stdin(Stdio::MakePipe);
|
cmd.stdin(Stdio::MakePipe);
|
||||||
cmd.stdout(Stdio::MakePipe);
|
cmd.stdout(Stdio::MakePipe);
|
||||||
|
@ -48,7 +48,7 @@ fn test_process_mask() {
|
||||||
let stdin_write = pipes.stdin.take().unwrap();
|
let stdin_write = pipes.stdin.take().unwrap();
|
||||||
let stdout_read = pipes.stdout.take().unwrap();
|
let stdout_read = pipes.stdout.take().unwrap();
|
||||||
|
|
||||||
t!(cvt(libc::pthread_sigmask(libc::SIG_SETMASK, old_set.as_ptr(), ptr::null_mut())));
|
t!(cvt_nz(libc::pthread_sigmask(libc::SIG_SETMASK, old_set.as_ptr(), ptr::null_mut())));
|
||||||
|
|
||||||
t!(cvt(libc::kill(cat.id() as libc::pid_t, libc::SIGINT)));
|
t!(cvt(libc::kill(cat.id() as libc::pid_t, libc::SIGINT)));
|
||||||
// We need to wait until SIGINT is definitely delivered. The
|
// We need to wait until SIGINT is definitely delivered. The
|
||||||
|
|
|
@ -328,6 +328,7 @@ impl Command {
|
||||||
#[cfg(not(target_os = "emscripten"))]
|
#[cfg(not(target_os = "emscripten"))]
|
||||||
{
|
{
|
||||||
use crate::mem::MaybeUninit;
|
use crate::mem::MaybeUninit;
|
||||||
|
use crate::sys::cvt_nz;
|
||||||
// Reset signal handling so the child process starts in a
|
// Reset signal handling so the child process starts in a
|
||||||
// standardized state. libstd ignores SIGPIPE, and signal-handling
|
// standardized state. libstd ignores SIGPIPE, and signal-handling
|
||||||
// libraries often set a mask. Child processes inherit ignored
|
// libraries often set a mask. Child processes inherit ignored
|
||||||
|
@ -337,7 +338,7 @@ impl Command {
|
||||||
// we're about to run.
|
// we're about to run.
|
||||||
let mut set = MaybeUninit::<libc::sigset_t>::uninit();
|
let mut set = MaybeUninit::<libc::sigset_t>::uninit();
|
||||||
cvt(sigemptyset(set.as_mut_ptr()))?;
|
cvt(sigemptyset(set.as_mut_ptr()))?;
|
||||||
cvt(libc::pthread_sigmask(libc::SIG_SETMASK, set.as_ptr(), ptr::null_mut()))?;
|
cvt_nz(libc::pthread_sigmask(libc::SIG_SETMASK, set.as_ptr(), ptr::null_mut()))?;
|
||||||
|
|
||||||
#[cfg(target_os = "android")] // see issue #88585
|
#[cfg(target_os = "android")] // see issue #88585
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue