From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35246) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Zml2G-0000IY-MD for qemu-devel@nongnu.org; Thu, 15 Oct 2015 12:05:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Zml2B-0000uN-If for qemu-devel@nongnu.org; Thu, 15 Oct 2015 12:05:44 -0400 Received: from e31.co.us.ibm.com ([32.97.110.149]:42060) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Zml2B-0000tx-AK for qemu-devel@nongnu.org; Thu, 15 Oct 2015 12:05:39 -0400 Received: from localhost by e31.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 15 Oct 2015 10:05:38 -0600 Received: from b03cxnp08026.gho.boulder.ibm.com (b03cxnp08026.gho.boulder.ibm.com [9.17.130.18]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id 57D9F1FF0021 for ; Thu, 15 Oct 2015 09:53:47 -0600 (MDT) Received: from d03av05.boulder.ibm.com (d03av05.boulder.ibm.com [9.17.195.85]) by b03cxnp08026.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t9FG4Yr411927986 for ; Thu, 15 Oct 2015 09:04:34 -0700 Received: from d03av05.boulder.ibm.com (localhost [127.0.0.1]) by d03av05.boulder.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t9FG5Yxa016425 for ; Thu, 15 Oct 2015 10:05:35 -0600 From: Michael Roth Date: Thu, 15 Oct 2015 11:05:16 -0500 Message-Id: <1444925118-10629-11-git-send-email-mdroth@linux.vnet.ibm.com> In-Reply-To: <1444925118-10629-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1444925118-10629-1-git-send-email-mdroth@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH 10/12] qga: handle possible SIGPIPE in guest-file-write List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, Yuri Pudgorodskiy , Michael Roth , "Denis V. Lunev" From: "Denis V. Lunev" 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 Signed-off-by: Yuri Pudgorodskiy Reviewed-by: Michael Roth Signed-off-by: Denis V. Lunev Signed-off-by: Michael Roth --- 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 abd21fc..b23929d 100644 --- a/qga/commands.c +++ b/qga/commands.c @@ -214,6 +214,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, @@ -239,7 +255,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