[prev in list] [next in list] [prev in thread] [next in thread]
List: git-commits-24
Subject: ia64: Fix narrow window during which signal could be delivered with only the memory
From: Linux Kernel Mailing List <linux-kernel () vger ! kernel ! org>
Date: 2002-09-27 23:37:13
[Download RAW message or body]
ChangeSet 1.676.7.17, 2002/09/27 17:37:13-06:00, davidm@tiger.hpl.hp.com
ia64: Fix narrow window during which signal could be delivered with only the memory
stack switched over to the alternate signal stack.
# This patch includes the following deltas:
# ChangeSet 1.676.7.16 -> 1.676.7.17
# arch/ia64/kernel/signal.c 1.7 -> 1.8
#
signal.c | 22 ++++++++++++++++++----
1 files changed, 18 insertions(+), 4 deletions(-)
diff -Nru a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c
--- a/arch/ia64/kernel/signal.c Wed Dec 18 11:32:42 2002
+++ b/arch/ia64/kernel/signal.c Wed Dec 18 11:32:42 2002
@@ -354,6 +354,15 @@
return err;
}
+/*
+ * Check whether the register-backing store is already on the signal stack.
+ */
+static inline int
+rbs_on_sig_stack (unsigned long bsp)
+{
+ return (bsp - current->sas_ss_sp < current->sas_ss_size);
+}
+
static long
setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,
struct sigscratch *scr)
@@ -366,10 +375,15 @@
frame = (void *) scr->pt.r12;
tramp_addr = GATE_ADDR + (ia64_sigtramp - __start_gate_section);
- if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && !on_sig_stack((unsigned long) frame)) {
- new_rbs = (current->sas_ss_sp + sizeof(long) - 1) & ~(sizeof(long) - 1);
- frame = (void *) ((current->sas_ss_sp + current->sas_ss_size)
- & ~(STACK_ALIGN - 1));
+ if (ka->sa.sa_flags & SA_ONSTACK) {
+ /* We need to check the memory and register stacks separately, because
+ they're switched separately (memory stack is switched in the kernel,
+ register stack is switched in the signal trampoline. */
+ if (!on_sig_stack((unsigned long) frame))
+ frame = (void *) ((current->sas_ss_sp + current->sas_ss_size)
+ & ~(STACK_ALIGN - 1));
+ if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
+ new_rbs = (current->sas_ss_sp + sizeof(long) - 1) & ~(sizeof(long) - 1);
}
frame = (void *) frame - ((sizeof(*frame) + STACK_ALIGN - 1) & ~(STACK_ALIGN - 1));
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-24" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic