|
@@ -766,8 +766,19 @@ get_sigframe (struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
|
|
|
|
|
|
/* This is the X/Open sanctioned signal stack switching. */
|
|
/* This is the X/Open sanctioned signal stack switching. */
|
|
if (ka->sa.sa_flags & SA_ONSTACK) {
|
|
if (ka->sa.sa_flags & SA_ONSTACK) {
|
|
- if (!on_sig_stack(esp))
|
|
|
|
|
|
+ int onstack = sas_ss_flags(esp);
|
|
|
|
+
|
|
|
|
+ if (onstack == 0)
|
|
esp = current->sas_ss_sp + current->sas_ss_size;
|
|
esp = current->sas_ss_sp + current->sas_ss_size;
|
|
|
|
+ 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(esp - frame_size)))
|
|
|
|
+ return (void __user *) -1L;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
/* Legacy stack switching not supported */
|
|
/* Legacy stack switching not supported */
|
|
|
|
|