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
---
src/util/util.c | 24 +++++++++++++++++++++++-
1 files changed, 23 insertions(+), 1 deletions(-)
diff --git a/src/util/util.c b/src/util/util.c
index f412a83..78ac168 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -642,12 +642,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) &&
--
1.7.3.4