From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48361) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y6Izr-0007y7-3B for qemu-devel@nongnu.org; Wed, 31 Dec 2014 08:07:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y6Izq-0007Tr-3o for qemu-devel@nongnu.org; Wed, 31 Dec 2014 08:07:31 -0500 Received: from mailhub.sw.ru ([195.214.232.25]:31897 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y6Izp-0007OQ-P4 for qemu-devel@nongnu.org; Wed, 31 Dec 2014 08:07:30 -0500 From: "Denis V. Lunev" Date: Wed, 31 Dec 2014 16:06:52 +0300 Message-Id: <1420031214-6053-7-git-send-email-den@openvz.org> In-Reply-To: <1420031214-6053-1-git-send-email-den@openvz.org> References: <1420031214-6053-1-git-send-email-den@openvz.org> Subject: [Qemu-devel] [PATCH 6/8] guest agent: ignore SIGPIPE signal List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Denis V. Lunev" , qemu-devel@nongnu.org, Simon Zolin , Michael Roth From: Simon Zolin If write operation fails on a pipe whose reading end is closed, qemu-ga won't be terminated, but instead write() will fail with error EPIPE. execve() inherits signals that are ignored, so reset SIGPIPE to its default handler before calling execve() in a forked process. Signed-off-by: Simon Zolin Signed-off-by: Denis V. Lunev CC: Michael Roth --- qga/commands-posix.c | 16 ++++++++++++++++ qga/main.c | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index d8e4ecf..bf9f79f 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -1030,6 +1030,20 @@ static int guest_exec_set_std(GuestFileHandle *gfh, int std_fd, int fd_null) return 0; } +/** Reset ignored signals back to default. */ +static void guest_exec_reset_child_sig(void) +{ + 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)); + } +} + int64_t qmp_guest_exec(const char *path, bool has_params, strList *params, bool has_env, strList *env, @@ -1102,6 +1116,8 @@ int64_t qmp_guest_exec(const char *path, /* exit(1); */ } + guest_exec_reset_child_sig(); + execvpe(path, (char * const *)argv, (char * const *)envp); slog("guest-exec child failed: %s", strerror(errno)); exit(1); diff --git a/qga/main.c b/qga/main.c index 9939a2b..bc6414c 100644 --- a/qga/main.c +++ b/qga/main.c @@ -160,6 +160,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