forked from OSchip/llvm-project
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,
|
eDupStderrFailed,
|
||||||
eChdirFailed,
|
eChdirFailed,
|
||||||
eExecFailed,
|
eExecFailed,
|
||||||
eSetGidFailed
|
eSetGidFailed,
|
||||||
|
eSetSigMaskFailed
|
||||||
};
|
};
|
||||||
|
|
||||||
// Child process.
|
// 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...
|
// Execute. We should never return...
|
||||||
execve(argv[0],
|
execve(argv[0],
|
||||||
const_cast<char *const *>(argv),
|
const_cast<char *const *>(argv),
|
||||||
|
@ -689,6 +696,9 @@ NativeProcessLinux::Launch(LaunchArgs *args, Error &error)
|
||||||
case eSetGidFailed:
|
case eSetGidFailed:
|
||||||
error.SetErrorString("Child setgid failed.");
|
error.SetErrorString("Child setgid failed.");
|
||||||
break;
|
break;
|
||||||
|
case eSetSigMaskFailed:
|
||||||
|
error.SetErrorString("Child failed to set signal mask.");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
error.SetErrorString("Child returned unknown exit status.");
|
error.SetErrorString("Child returned unknown exit status.");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -29,7 +29,6 @@ class ExprCommandThatRestartsTestCase(TestBase):
|
||||||
|
|
||||||
@dwarf_test
|
@dwarf_test
|
||||||
@skipIfFreeBSD # llvm.org/pr19246: intermittent failure
|
@skipIfFreeBSD # llvm.org/pr19246: intermittent failure
|
||||||
@expectedFailureLinux("llvm.org/pr19246")
|
|
||||||
@skipIfDarwin # llvm.org/pr19246: intermittent failure
|
@skipIfDarwin # llvm.org/pr19246: intermittent failure
|
||||||
@skipIfWindows # Test relies on signals, unsupported on Windows
|
@skipIfWindows # Test relies on signals, unsupported on Windows
|
||||||
def test_with_dwarf(self):
|
def test_with_dwarf(self):
|
||||||
|
|
Loading…
Reference in New Issue