Quoting Denis V. Lunev (2015-10-01 02:38:02) > qemu-ga should not exit on guest-file-write to pipe without read end > but proper error code should be returned. The behavior of the > spawned process should be default thus SIGPIPE processing should be > reset to default after fork() but before exec(). > > Signed-off-by: Denis V. Lunev <d...@openvz.org> > Signed-off-by: Yuri Pudgorodskiy <y...@virtuozzo.com> > CC: Michael Roth <mdr...@linux.vnet.ibm.com>
Reviewed-by: Michael Roth <mdr...@linux.vnet.ibm.com> > --- > qga/commands.c | 18 +++++++++++++++++- > qga/main.c | 6 ++++++ > 2 files changed, 23 insertions(+), 1 deletion(-) > > diff --git a/qga/commands.c b/qga/commands.c > index 6efd6aa..199c7c3 100644 > --- a/qga/commands.c > +++ b/qga/commands.c > @@ -194,6 +194,22 @@ static void guest_exec_child_watch(GPid pid, gint > status, gpointer data) > g_spawn_close_pid(pid); > } > > +/** Reset ignored signals back to default. */ > +static void guest_exec_task_setup(gpointer data) > +{ > +#if !defined(G_OS_WIN32) > + struct sigaction sigact; > + > + memset(&sigact, 0, sizeof(struct sigaction)); > + sigact.sa_handler = SIG_DFL; > + > + if (sigaction(SIGPIPE, &sigact, NULL) != 0) { > + slog("sigaction() failed to reset child process's SIGPIPE: %s", > + strerror(errno)); > + } > +#endif > +} > + > GuestExec *qmp_guest_exec(const char *path, > bool has_arg, strList *arg, > bool has_env, strList *env, > @@ -219,7 +235,7 @@ GuestExec *qmp_guest_exec(const char *path, > G_SPAWN_SEARCH_PATH | > G_SPAWN_DO_NOT_REAP_CHILD | > G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, > - NULL, NULL, &pid, NULL, NULL, NULL, &gerr); > + guest_exec_task_setup, NULL, &pid, NULL, NULL, NULL, &gerr); > if (!ret) { > error_setg(err, QERR_QGA_COMMAND_FAILED, gerr->message); > g_error_free(gerr); > diff --git a/qga/main.c b/qga/main.c > index d8e063a..07e3c1c 100644 > --- a/qga/main.c > +++ b/qga/main.c > @@ -161,6 +161,12 @@ static gboolean register_signal_handlers(void) > g_error("error configuring signal handler: %s", strerror(errno)); > } > > + sigact.sa_handler = SIG_IGN; > + if (sigaction(SIGPIPE, &sigact, NULL) != 0) { > + g_error("error configuring SIGPIPE signal handler: %s", > + strerror(errno)); > + } > + > return true; > } > > -- > 2.1.4 >