Linux PARISC architecture development
 help / color / mirror / Atom feed
* sigaltstack doesn't round ss.ss_sp as required
@ 2012-11-24 15:05 John David Anglin
  2012-11-25 21:39 ` [PATCH] parisc: " John David Anglin
  0 siblings, 1 reply; 4+ messages in thread
From: John David Anglin @ 2012-11-24 15:05 UTC (permalink / raw)
  To: Parisc List

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.

According to the Linux manual page:

"When a signal handler is invoked on the alternate stack, the kernel
automatically aligns the address given in ss.ss_sp to a suitable address
boundary for the underlying hardware architecture."

The stack address for the signal handler needs to be adjusted to provide
for frame marker and stack argument slots.

Dave
--
John David Anglin	dave.anglin@bell.net




^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] parisc: sigaltstack doesn't round ss.ss_sp as required
  2012-11-24 15:05 sigaltstack doesn't round ss.ss_sp as required John David Anglin
@ 2012-11-25 21:39 ` John David Anglin
  2012-11-25 22:07   ` Rolf Eike Beer
  0 siblings, 1 reply; 4+ messages in thread
From: John David Anglin @ 2012-11-25 21:39 UTC (permalink / raw)
  To: John David Anglin; +Cc: Helge Deller, Parisc List, James E.J. Bottomley

[-- Attachment #1: Type: text/plain, Size: 370 bytes --]

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.

Signed-off-by: John David Anglin <dave.anglin@bell.net>


[-- Attachment #2: signal.c.d.txt --]
[-- Type: text/plain, Size: 778 bytes --]

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. */

[-- Attachment #3: Type: text/plain, Size: 45 bytes --]



--
John David Anglin	dave.anglin@bell.net


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] parisc: sigaltstack doesn't round ss.ss_sp as required
  2012-11-25 21:39 ` [PATCH] parisc: " John David Anglin
@ 2012-11-25 22:07   ` Rolf Eike Beer
  2012-11-25 22:32     ` John David Anglin
  0 siblings, 1 reply; 4+ messages in thread
From: Rolf Eike Beer @ 2012-11-25 22:07 UTC (permalink / raw)
  To: John David Anglin; +Cc: Helge Deller, Parisc List, James E.J. Bottomley

[-- Attachment #1: Type: text/plain, Size: 1268 bytes --]

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);

Greetings.

Eike

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] parisc: sigaltstack doesn't round ss.ss_sp as required
  2012-11-25 22:07   ` Rolf Eike Beer
@ 2012-11-25 22:32     ` John David Anglin
  0 siblings, 0 replies; 4+ messages in thread
From: John David Anglin @ 2012-11-25 22:32 UTC (permalink / raw)
  To: Rolf Eike Beer; +Cc: Helge Deller, Parisc List, James E.J. Bottomley

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@bell.net




^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-11-25 22:32 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-24 15:05 sigaltstack doesn't round ss.ss_sp as required John David Anglin
2012-11-25 21:39 ` [PATCH] parisc: " John David Anglin
2012-11-25 22:07   ` Rolf Eike Beer
2012-11-25 22:32     ` John David Anglin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox