Skip to content

Commit

Permalink
[PATCH] ppc64: fix 32-bit signal frame back link
Browse files Browse the repository at this point in the history
When the kernel creates a signal frame on the user stack, it puts the
old stack pointer value at the beginning so that the signal frame is
linked into the chain of stack frames like any other frame.
Unfortunately, for 32-bit processes we are writing the old stack
pointer as a 64-bit value rather than a 32-bit value, and the process
sees that as a null pointer, since it only looks at the first 32 bits,
which are zero since ppc is bigendian and the stack pointer is below
4GB.  This bug is in SLES9 and RHEL4 too, hence the ccs.

This patch fixes the bug by making the signal code write the old stack
pointer as a u32 instead of an unsigned long.

Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Paul Mackerras authored and Linus Torvalds committed Apr 30, 2005
1 parent a6ad57f commit 9747dd6
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions arch/ppc64/kernel/signal32.c
Original file line number Diff line number Diff line change
Expand Up @@ -657,7 +657,7 @@ static int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,

/* Save user registers on the stack */
frame = &rt_sf->uc.uc_mcontext;
if (put_user(regs->gpr[1], (unsigned long __user *)newsp))
if (put_user(regs->gpr[1], (u32 __user *)newsp))
goto badframe;

if (vdso32_rt_sigtramp && current->thread.vdso_base) {
Expand Down Expand Up @@ -842,7 +842,7 @@ static int handle_signal32(unsigned long sig, struct k_sigaction *ka,
regs->link = (unsigned long) frame->mctx.tramp;
}

if (put_user(regs->gpr[1], (unsigned long __user *)newsp))
if (put_user(regs->gpr[1], (u32 __user *)newsp))
goto badframe;
regs->gpr[1] = (unsigned long) newsp;
regs->gpr[3] = sig;
Expand Down

0 comments on commit 9747dd6

Please sign in to comment.