From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55409) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZYNLi-00034b-C2 for qemu-devel@nongnu.org; Sat, 05 Sep 2015 19:58:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZYNLf-0005v9-CL for qemu-devel@nongnu.org; Sat, 05 Sep 2015 19:58:22 -0400 Received: from avasout06.plus.net ([212.159.14.18]:39209) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZYNLf-0005sq-7a for qemu-devel@nongnu.org; Sat, 05 Sep 2015 19:58:19 -0400 From: Timothy E Baldwin Date: Sun, 6 Sep 2015 00:57:14 +0100 Message-Id: <1441497448-32489-21-git-send-email-T.E.Baldwin99@members.leeds.ac.uk> In-Reply-To: <1441497448-32489-1-git-send-email-T.E.Baldwin99@members.leeds.ac.uk> References: <1441497448-32489-1-git-send-email-T.E.Baldwin99@members.leeds.ac.uk> Subject: [Qemu-devel] [PATCH 20/34] linux-user: Remove redundant default action check in queue_signal() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: riku.voipio@iki.fi, Timothy E Baldwin Both queue_signal() and process_pending_signals() did check for default actions of signals, this is redundant and also causes fatal and stopping signals to incorrectly cause guest system calls to be interrupted. The code in queue_signal() is removed. Signed-off-by: Timothy Edward Baldwin --- linux-user/signal.c | 37 ------------------------------------- 1 file changed, 37 deletions(-) diff --git a/linux-user/signal.c b/linux-user/signal.c index 3e272a5..f57dbf5 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -514,49 +514,13 @@ int queue_signal(CPUArchState *env, int sig, target_siginfo_t *info) TaskState *ts = cpu->opaque; struct emulated_sigtable *k; struct sigqueue *q, **pq; - abi_ulong handler; - int queue; #if defined(DEBUG_SIGNAL) fprintf(stderr, "queue_signal: sig=%d\n", sig); #endif k = &ts->sigtab[sig - 1]; - queue = gdb_queuesig (); - handler = sigact_table[sig - 1]._sa_handler; - if (sig == TARGET_SIGSEGV && sigismember(&ts->signal_mask, SIGSEGV)) { - /* Guest has blocked SIGSEGV but we got one anyway. Assume this - * is a forced SIGSEGV (ie one the kernel handles via force_sig_info - * because it got a real MMU fault). A blocked SIGSEGV in that - * situation is treated as if using the default handler. This is - * not correct if some other process has randomly sent us a SIGSEGV - * via kill(), but that is not easy to distinguish at this point, - * so we assume it doesn't happen. - */ - handler = TARGET_SIG_DFL; - } - - if (!queue && handler == TARGET_SIG_DFL) { - if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) { - kill(getpid(),SIGSTOP); - return 0; - } else - /* default handler : ignore some signal. The other are fatal */ - if (sig != TARGET_SIGCHLD && - sig != TARGET_SIGURG && - sig != TARGET_SIGWINCH && - sig != TARGET_SIGCONT) { - force_sig(sig); - } else { - return 0; /* indicate ignored */ - } - } else if (!queue && handler == TARGET_SIG_IGN) { - /* ignore signal */ - return 0; - } else if (!queue && handler == TARGET_SIG_ERR) { - force_sig(sig); - } else { pq = &k->first; if (sig < TARGET_SIGRTMIN) { /* if non real time signal, we queue exactly one signal */ @@ -583,7 +547,6 @@ int queue_signal(CPUArchState *env, int sig, target_siginfo_t *info) /* signal that a new signal is pending */ ts->signal_pending = 1; return 1; /* indicates that the signal was queued */ - } } #if defined(__x86_64__) -- 2.1.4