* [PATCH 4/5] signal(ia64): add a signal stack overflow check
@ 2008-02-18 10:26 Shi Weihua
2008-02-18 12:30 ` Matthew Wilcox
2008-02-19 2:25 ` Shi Weihua
0 siblings, 2 replies; 4+ messages in thread
From: Shi Weihua @ 2008-02-18 10:26 UTC (permalink / raw)
To: tony.luck; +Cc: linux-kernel, linux-ia64
The similar check has been added to x86_32(i386) in commit
id 83bd01024b1fdfc41d9b758e5669e80fca72df66.
So we add this check to ia64 and improve it a liitle bit in that
we need to check for stack overflow only when the signal is on stack.
Signed-off-by: Shi Weihua <shiwh@cn.fujitsu.com>
---
--- linux-2.6.25-rc2.orig/arch/ia64/kernel/signal.c 2008-02-16 04:57:20.000000000 +0800
+++ linux-2.6.25-rc2/arch/ia64/kernel/signal.c 2008-02-18 18:17:15.000000000 +0800
@@ -342,15 +342,29 @@ setup_frame (int sig, struct k_sigaction
new_sp = scr->pt.r12;
tramp_addr = (unsigned long) __kernel_sigtramp;
- if ((ka->sa.sa_flags & SA_ONSTACK) && sas_ss_flags(new_sp) == 0) {
- new_sp = current->sas_ss_sp + current->sas_ss_size;
- /*
- * We need to check for the register stack being on the signal stack
- * separately, because it's switched separately (memory stack is switched
- * in the kernel, register stack is switched in the signal trampoline).
- */
- if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
- new_rbs = (current->sas_ss_sp + sizeof(long) - 1) & ~(sizeof(long) - 1);
+ if (ka->sa.sa_flags & SA_ONSTACK) {
+ int onstack = sas_ss_flags(new_sp);
+
+ if (onstack == 0) {
+ new_sp = current->sas_ss_sp + current->sas_ss_size;
+ /*
+ * We need to check for the register stack being on the
+ * signal stack separately, because it's switched
+ * separately (memory stack is switched in the kernel,
+ * register stack is switched in the signal trampoline).
+ */
+ if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
+ new_rbs = (current->sas_ss_sp +
+ sizeof(long) - 1) & ~(sizeof(long) - 1);
+ } else if (onstack == SS_ONSTACK) {
+ /*
+ * If we are on the alternate signal stack and would
+ * overflow it, don't return an always-bogus address
+ * instead so we will die with SIGSEGV.
+ */
+ if (!likely(on_sig_stack(new_sp - sizeof(*frame))))
+ return force_sigsegv_info(sig, frame);
+ }
}
frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN);
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 4/5] signal(ia64): add a signal stack overflow check
2008-02-18 10:26 [PATCH 4/5] signal(ia64): add a signal stack overflow check Shi Weihua
@ 2008-02-18 12:30 ` Matthew Wilcox
2008-02-19 2:03 ` Shi Weihua
2008-02-19 2:25 ` Shi Weihua
1 sibling, 1 reply; 4+ messages in thread
From: Matthew Wilcox @ 2008-02-18 12:30 UTC (permalink / raw)
To: Shi Weihua; +Cc: tony.luck, linux-kernel, linux-ia64
On Mon, Feb 18, 2008 at 06:26:23PM +0800, Shi Weihua wrote:
> + if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
> + new_rbs = (current->sas_ss_sp +
> + sizeof(long) - 1) & ~(sizeof(long) - 1);
I know you're only moving this code, but how about fixing it to use
ALIGN at the same time?
+ if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
+ new_rbs = ALIGN(current->sas_ss_sp,
+ sizeof(long));
--
Intel are signing my paycheques ... these opinions are still mine
"Bill, look, we understand that you're interested in selling us this
operating system, but compare it to ours. We can't possibly take such
a retrograde step."
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 4/5] signal(ia64): add a signal stack overflow check
2008-02-18 12:30 ` Matthew Wilcox
@ 2008-02-19 2:03 ` Shi Weihua
0 siblings, 0 replies; 4+ messages in thread
From: Shi Weihua @ 2008-02-19 2:03 UTC (permalink / raw)
To: Matthew Wilcox; +Cc: tony.luck, linux-kernel, linux-ia64
Matthew Wilcox wrote::
> On Mon, Feb 18, 2008 at 06:26:23PM +0800, Shi Weihua wrote:
>> + if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
>> + new_rbs = (current->sas_ss_sp +
>> + sizeof(long) - 1) & ~(sizeof(long) - 1);
>
> I know you're only moving this code, but how about fixing it to use
> ALIGN at the same time?
>
> + if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
> + new_rbs = ALIGN(current->sas_ss_sp,
> + sizeof(long));
>
Of course,we can improve the code by ALIGN.
---
The similar check has been added to x86_32(i386) in commit
id 83bd01024b1fdfc41d9b758e5669e80fca72df66.
So we add this check to ia64 and improve it a liitle bit in that
we need to check for stack overflow only when the signal is on stack.
Signed-off-by: Shi Weihua <shiwh@cn.fujitsu.com>
---
--- linux-2.6.25-rc2.orig/arch/ia64/kernel/signal.c 2008-02-16 04:57:20.000000000 +0800
+++ linux-2.6.25-rc2/arch/ia64/kernel/signal.c 2008-02-19 09:57:05.000000000 +0800
@@ -342,15 +342,33 @@ setup_frame (int sig, struct k_sigaction
new_sp = scr->pt.r12;
tramp_addr = (unsigned long) __kernel_sigtramp;
- if ((ka->sa.sa_flags & SA_ONSTACK) && sas_ss_flags(new_sp) == 0) {
- new_sp = current->sas_ss_sp + current->sas_ss_size;
- /*
- * We need to check for the register stack being on the signal stack
- * separately, because it's switched separately (memory stack is switched
- * in the kernel, register stack is switched in the signal trampoline).
- */
- if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
- new_rbs = (current->sas_ss_sp + sizeof(long) - 1) & ~(sizeof(long) - 1);
+ if (ka->sa.sa_flags & SA_ONSTACK) {
+ int onstack = sas_ss_flags(new_sp);
+
+ if (onstack == 0) {
+ new_sp = current->sas_ss_sp + current->sas_ss_size;
+ /*
+ * We need to check for the register stack being on the
+ * signal stack separately, because it's switched
+ * separately (memory stack is switched in the kernel,
+ * register stack is switched in the signal trampoline).
+ */
+ if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
+ new_rbs = ALIGN(current->sas_ss_sp,
+ sizeof(long));
+ } else if (onstack == SS_ONSTACK) {
+ unsigned long check_sp;
+
+ /*
+ * If we are on the alternate signal stack and would
+ * overflow it, don't. Return an always-bogus address
+ * instead so we will die with SIGSEGV.
+ */
+ check_sp = (new_sp - sizeof(*frame)) & -STACK_ALIGN;
+ if (!likely(on_sig_stack(check_sp)))
+ return force_sigsegv_info(sig, (void __user *)
+ check_sp);
+ }
}
frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN);
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 4/5] signal(ia64): add a signal stack overflow check
2008-02-18 10:26 [PATCH 4/5] signal(ia64): add a signal stack overflow check Shi Weihua
2008-02-18 12:30 ` Matthew Wilcox
@ 2008-02-19 2:25 ` Shi Weihua
1 sibling, 0 replies; 4+ messages in thread
From: Shi Weihua @ 2008-02-19 2:25 UTC (permalink / raw)
To: tony.luck; +Cc: linux-kernel, linux-ia64
The similar check has been added to x86_32(i386) in commit
id 83bd01024b1fdfc41d9b758e5669e80fca72df66.
So we add this check to ia64 and improve it a liitle bit in that
we need to check for stack overflow only when the signal is on stack.
Signed-off-by: Shi Weihua <shiwh@cn.fujitsu.com>
---
The previous patch has a comment mistake. Now I correct it.
---
--- linux-2.6.25-rc2.orig/arch/ia64/kernel/signal.c 2008-02-16 04:57:20.000000000 +0800
+++ linux-2.6.25-rc2/arch/ia64/kernel/signal.c 2008-02-19 09:57:05.000000000 +0800
@@ -342,15 +342,33 @@ setup_frame (int sig, struct k_sigaction
new_sp = scr->pt.r12;
tramp_addr = (unsigned long) __kernel_sigtramp;
- if ((ka->sa.sa_flags & SA_ONSTACK) && sas_ss_flags(new_sp) == 0) {
- new_sp = current->sas_ss_sp + current->sas_ss_size;
- /*
- * We need to check for the register stack being on the signal stack
- * separately, because it's switched separately (memory stack is switched
- * in the kernel, register stack is switched in the signal trampoline).
- */
- if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
- new_rbs = (current->sas_ss_sp + sizeof(long) - 1) & ~(sizeof(long) - 1);
+ if (ka->sa.sa_flags & SA_ONSTACK) {
+ int onstack = sas_ss_flags(new_sp);
+
+ if (onstack == 0) {
+ new_sp = current->sas_ss_sp + current->sas_ss_size;
+ /*
+ * We need to check for the register stack being on the
+ * signal stack separately, because it's switched
+ * separately (memory stack is switched in the kernel,
+ * register stack is switched in the signal trampoline).
+ */
+ if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
+ new_rbs = ALIGN(current->sas_ss_sp,
+ sizeof(long));
+ } else if (onstack == SS_ONSTACK) {
+ unsigned long check_sp;
+
+ /*
+ * If we are on the alternate signal stack and would
+ * overflow it, don't. Return an always-bogus address
+ * instead so we will die with SIGSEGV.
+ */
+ check_sp = (new_sp - sizeof(*frame)) & -STACK_ALIGN;
+ if (!likely(on_sig_stack(check_sp)))
+ return force_sigsegv_info(sig, (void __user *)
+ check_sp);
+ }
}
frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN);
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2008-02-19 2:27 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-02-18 10:26 [PATCH 4/5] signal(ia64): add a signal stack overflow check Shi Weihua
2008-02-18 12:30 ` Matthew Wilcox
2008-02-19 2:03 ` Shi Weihua
2008-02-19 2:25 ` Shi Weihua
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox