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) {
|
if ((hook)(data) != 0) {
|
||||||
VIR_DEBUG0("Hook function failed.");
|
VIR_DEBUG0("Hook function failed.");
|
||||||
goto fork_error;
|
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
|
/* The steps above may need todo something privileged, so
|
||||||
* we delay clearing capabilities until the last minute */
|
* we delay clearing capabilities until the last minute */
|
||||||
if ((flags & VIR_EXEC_CLEAR_CAPS) &&
|
if ((flags & VIR_EXEC_CLEAR_CAPS) &&
|
||||||
|
Loading…
Reference in New Issue
Block a user