mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-12 21:28:48 +00:00
On Linux, clear the signal mask of the launched inferior
Summary: Due to fork()/execve(), the launched inferior inherits the signal mask of its parent (lldb-server). But because lldb-server modifies its signal mask (It blocks SIGCHLD, for example), the inferior starts with some signals being initially blocked. One consequence is that TestCallThatRestarts.ExprCommandThatRestartsTestCase (test/expression_command/call-restarts) fails because sigchld_handler() in lotta-signals.c is not called, due to the SIGCHLD signal being blocked. To prevent the signal masking done by lldb-server from affecting the created inferior, the signal mask of the inferior is now cleared before the execve(). Patch by: Yacine Belkadi Reviewers: ovyalov, labath Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D12138 llvm-svn: 245436
This commit is contained in:
parent
bc224b8049
commit
78856474fb
@ -554,7 +554,8 @@ NativeProcessLinux::Launch(LaunchArgs *args, Error &error)
|
||||
eDupStderrFailed,
|
||||
eChdirFailed,
|
||||
eExecFailed,
|
||||
eSetGidFailed
|
||||
eSetGidFailed,
|
||||
eSetSigMaskFailed
|
||||
};
|
||||
|
||||
// Child process.
|
||||
@ -632,6 +633,12 @@ NativeProcessLinux::Launch(LaunchArgs *args, Error &error)
|
||||
}
|
||||
}
|
||||
|
||||
// Clear the signal mask to prevent the child from being affected by
|
||||
// any masking done by the parent.
|
||||
sigset_t set;
|
||||
if (sigemptyset(&set) != 0 || pthread_sigmask(SIG_SETMASK, &set, nullptr) != 0)
|
||||
exit(eSetSigMaskFailed);
|
||||
|
||||
// Execute. We should never return...
|
||||
execve(argv[0],
|
||||
const_cast<char *const *>(argv),
|
||||
@ -689,6 +696,9 @@ NativeProcessLinux::Launch(LaunchArgs *args, Error &error)
|
||||
case eSetGidFailed:
|
||||
error.SetErrorString("Child setgid failed.");
|
||||
break;
|
||||
case eSetSigMaskFailed:
|
||||
error.SetErrorString("Child failed to set signal mask.");
|
||||
break;
|
||||
default:
|
||||
error.SetErrorString("Child returned unknown exit status.");
|
||||
break;
|
||||
|
@ -29,7 +29,6 @@ class ExprCommandThatRestartsTestCase(TestBase):
|
||||
|
||||
@dwarf_test
|
||||
@skipIfFreeBSD # llvm.org/pr19246: intermittent failure
|
||||
@expectedFailureLinux("llvm.org/pr19246")
|
||||
@skipIfDarwin # llvm.org/pr19246: intermittent failure
|
||||
@skipIfWindows # Test relies on signals, unsupported on Windows
|
||||
def test_with_dwarf(self):
|
||||
|
Loading…
x
Reference in New Issue
Block a user