From patchwork Fri Jun 19 16:51:27 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Denis V. Lunev" X-Patchwork-Id: 486797 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id CF92C1401DE for ; Sat, 20 Jun 2015 02:48:50 +1000 (AEST) Received: from localhost ([::1]:59141 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z5zTF-0007my-2K for incoming@patchwork.ozlabs.org; Fri, 19 Jun 2015 12:48:49 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41591) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z5zSg-0006g4-Dn for qemu-devel@nongnu.org; Fri, 19 Jun 2015 12:48:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z5zSe-0007ak-GJ for qemu-devel@nongnu.org; Fri, 19 Jun 2015 12:48:14 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:48476 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z5zSe-0007aJ-1P for qemu-devel@nongnu.org; Fri, 19 Jun 2015 12:48:12 -0400 Received: from hades.sw.ru ([10.30.8.132]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id t5JGlp1g026593; Fri, 19 Jun 2015 19:47:59 +0300 (MSK) From: "Denis V. Lunev" To: Date: Fri, 19 Jun 2015 19:51:27 +0300 Message-Id: <1434732693-24127-5-git-send-email-den@openvz.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1434732693-24127-1-git-send-email-den@openvz.org> References: <1434732693-24127-1-git-send-email-den@openvz.org> X-detected-operating-system: by eggs.gnu.org: OpenBSD 3.x X-Received-From: 195.214.232.25 Cc: Olga Krishtal , Michael Roth , qemu-devel@nongnu.org, Olga Krishtal , "Denis V. Lunev" Subject: [Qemu-devel] [PATCH 04/10] qga: handle possible SIGPIPE in guest-file-write X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Olga Krishtal 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: Olga Krishtal Acked-by: Roman Kagan Signed-off-by: Denis V. Lunev CC: Eric Blake 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 aa11932..64d9b2d 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -961,6 +961,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)); + } +} + GuestExec *qmp_guest_exec(const char *path, bool has_params, strList *params, bool has_env, strList *env, @@ -1032,6 +1046,8 @@ GuestExec *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; }