Skip to content

Commit

Permalink
sparc32: Fix unaligned stack handling on trap return.
Browse files Browse the repository at this point in the history
When the rett stack checking code sees the stack is unaligned (in both
the sun4c and srmmu cases) it jumps to the window fault-in path.

But that just tries to page the stack pages in, it doesn't do anything
special if the stack is misaligned.

Therefore we essentially just loop forever in the trap return path.

Fix this by emitting a SIGILL in the stack fault-in code if the stack
is mis-aligned.

Reported-by: Al Viro <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
davem330 committed Oct 26, 2010
1 parent caebf91 commit 9088333
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions arch/sparc/mm/fault_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,12 @@ static void force_user_fault(unsigned long address, int write)
__do_fault_siginfo(BUS_ADRERR, SIGBUS, tsk->thread.kregs, address);
}

static void check_stack_aligned(unsigned long sp)
{
if (sp & 0x7UL)
force_sig(SIGILL, current);
}

void window_overflow_fault(void)
{
unsigned long sp;
Expand All @@ -547,13 +553,17 @@ void window_overflow_fault(void)
if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
force_user_fault(sp + 0x38, 1);
force_user_fault(sp, 1);

check_stack_aligned(sp);
}

void window_underflow_fault(unsigned long sp)
{
if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
force_user_fault(sp + 0x38, 0);
force_user_fault(sp, 0);

check_stack_aligned(sp);
}

void window_ret_fault(struct pt_regs *regs)
Expand All @@ -564,4 +574,6 @@ void window_ret_fault(struct pt_regs *regs)
if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
force_user_fault(sp + 0x38, 0);
force_user_fault(sp, 0);

check_stack_aligned(sp);
}

0 comments on commit 9088333

Please sign in to comment.