On 25-Nov-12, at 5:07 PM, Rolf Eike Beer wrote:
John David Anglin wrote:
On 24-Nov-12, at 10:05 AM, John David Anglin wrote:
In trying to build the debian libsigsegv2 package, I found that
sigaltstack
doesn't round ss.ss_sp. The tests intentionally pass an unaligned
pointer.
This results in the two stack overflow tests failing.
The attached patch fixes this issue.
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c
index 594459b..324644d 100644
--- a/arch/parisc/kernel/signal.c
+++ b/arch/parisc/kernel/signal.c
@@ -188,8 +188,10 @@ get_sigframe(struct k_sigaction *ka, unsigned
long sp, size_t frame_size)
DBG(1,"get_sigframe: ka = %#lx, sp = %#lx, frame_size = %#lx\n",
(unsigned long)ka, sp, frame_size);
+ /* Align alternate stack and reserve 64 bytes for the signal
+ handler's frame marker. */
if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
- sp = current->sas_ss_sp; /* Stacks grow up! */
+ sp = (current->sas_ss_sp + 0x7f) & ~0x3f; /* Stacks grow up! */
DBG(1,"get_sigframe: Returning sp = %#lx\n", (unsigned long)sp);
return (void __user *) sp; /* Stacks grow up. Fun. */
What about something like this (entirely untested, but you'll get
the idea):
sp = round_down(current->sas_ss_sp + 64, 64);
We need to round up to ensure a full 64 bytes for frame marker.
I'll leave it to James to decide if it makes the code clearer.
Dave
--
John David Anglin dave.anglin@xxxxxxxx
--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html