mirror of https://gitee.com/openkylin/qemu.git
linux-user: Remove redundant default action check in queue_signal()
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 <T.E.Baldwin99@members.leeds.ac.uk> Message-id: 1441497448-32489-21-git-send-email-T.E.Baldwin99@members.leeds.ac.uk Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
3d3efba020
commit
c19c1578f8
|
@ -525,46 +525,10 @@ 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;
|
||||
|
||||
trace_user_queue_signal(env, sig);
|
||||
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 */
|
||||
|
@ -591,7 +555,6 @@ int queue_signal(CPUArchState *env, int sig, target_siginfo_t *info)
|
|||
/* signal that a new signal is pending */
|
||||
atomic_set(&ts->signal_pending, 1);
|
||||
return 1; /* indicates that the signal was queued */
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef HAVE_SAFE_SYSCALL
|
||||
|
|
Loading…
Reference in New Issue