mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 06:35:24 +00:00
Block SIGPIPE around virExec hook functions
Some functionality run in virExec hooks may do I/O which can trigger SIGPIPE. Renable SIGPIPE blocking around the hook function * src/util/util.c: Block SIGPIPE around hooks
This commit is contained in:
parent
cd782cc391
commit
ab07533e76
@ -644,12 +644,34 @@ __virExec(const char *const*argv,
|
||||
}
|
||||
}
|
||||
|
||||
if (hook)
|
||||
if (hook) {
|
||||
/* virFork reset all signal handlers to the defaults.
|
||||
* This is good for the child process, but our hook
|
||||
* risks running something that generates SIGPIPE,
|
||||
* so we need to temporarily block that again
|
||||
*/
|
||||
struct sigaction waxon, waxoff;
|
||||
waxoff.sa_handler = SIG_IGN;
|
||||
waxoff.sa_flags = 0;
|
||||
memset(&waxon, 0, sizeof(waxon));
|
||||
if (sigaction(SIGPIPE, &waxoff, &waxon) < 0) {
|
||||
virReportSystemError(errno, "%s",
|
||||
_("Could not disable SIGPIPE"));
|
||||
goto fork_error;
|
||||
}
|
||||
|
||||
if ((hook)(data) != 0) {
|
||||
VIR_DEBUG0("Hook function failed.");
|
||||
goto fork_error;
|
||||
}
|
||||
|
||||
if (sigaction(SIGPIPE, &waxon, NULL) < 0) {
|
||||
virReportSystemError(errno, "%s",
|
||||
_("Could not re-enable SIGPIPE"));
|
||||
goto fork_error;
|
||||
}
|
||||
}
|
||||
|
||||
/* The steps above may need todo something privileged, so
|
||||
* we delay clearing capabilities until the last minute */
|
||||
if ((flags & VIR_EXEC_CLEAR_CAPS) &&
|
||||
|
Loading…
Reference in New Issue
Block a user