[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v4 11/14] qga: handle possible SIGPIPE in guest-file-
From: |
Michael Roth |
Subject: |
[Qemu-devel] [PULL v4 11/14] qga: handle possible SIGPIPE in guest-file-write |
Date: |
Mon, 19 Oct 2015 18:38:16 -0500 |
From: "Denis V. Lunev" <address@hidden>
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 <address@hidden>
Signed-off-by: Yuri Pudgorodskiy <address@hidden>
Reviewed-by: Michael Roth <address@hidden>
Signed-off-by: Denis V. Lunev <address@hidden>
Signed-off-by: Michael Roth <address@hidden>
---
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 ced72d5..68e8cfa 100644
--- a/qga/commands.c
+++ b/qga/commands.c
@@ -225,6 +225,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,
@@ -250,7 +266,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 aa6a063..068169f 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;
}
--
1.9.1
- [Qemu-devel] [PULL v4 00/14] qemu-ga patch queue, Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 09/14] qga: drop guest_file_init helper and replace it with static initializers, Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 10/14] qga: guest exec functionality, Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 03/14] qga: add QGA_CONF environment variable, Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 12/14] qga: handle G_IO_STATUS_AGAIN in ga_channel_write_all(), Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 13/14] qga: guest-exec simple stdin/stdout/stderr redirection, Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 07/14] qga: guest-get-memory-blocks shouldn't fail for unexposed memory blocks, Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 11/14] qga: handle possible SIGPIPE in guest-file-write,
Michael Roth <=
- [Qemu-devel] [PULL v4 14/14] qga: fix uninitialized value warning for win32, Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 05/14] qtest: add a few fd-level qmp helpers, Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 04/14] qga: do not override configuration verbosity, Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 01/14] build: qemu-ga: add 'qemu-ga' build target for w32, Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 02/14] qga: Use g_new() & friends where that makes obvious sense, Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 06/14] glib-compat: add 2.38/2.40/2.46 asserts, Michael Roth, 2015/10/19
- [Qemu-devel] [PULL v4 08/14] tests: add a local test for guest agent, Michael Roth, 2015/10/19
- Re: [Qemu-devel] [PULL v4 00/14] qemu-ga patch queue, Peter Maydell, 2015/10/20