Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

[PATCH] i386: fix stack alignment for signal handlers

This fixes the setup of the alignment of the signal frame, so that all
signal handlers are run with a properly aligned stack frame.

The current code "over-aligns" the stack pointer so that the stack frame
is effectively always mis-aligned by 4 bytes. But what we really want
is that on function entry ((sp + 4) & 15) == 0, which matches what would
happen if the stack were aligned before a "call" instruction.

Signed-off-by: Markus F.X.J. Oberhumer <markus@oberhumer.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Markus F.X.J. Oberhumer and committed by
Linus Torvalds
d347f372 867f8b4e

+10 -2
+5 -1
arch/i386/kernel/signal.c
··· 338 338 esp = (unsigned long) ka->sa.sa_restorer; 339 339 } 340 340 341 - return (void __user *)((esp - frame_size) & -8ul); 341 + esp -= frame_size; 342 + /* Align the stack pointer according to the i386 ABI, 343 + * i.e. so that on function entry ((sp + 4) & 15) == 0. */ 344 + esp = ((esp + 4) & -16ul) - 4; 345 + return (void __user *) esp; 342 346 } 343 347 344 348 /* These symbols are defined with the addresses in the vsyscall page.
+5 -1
arch/x86_64/ia32/ia32_signal.c
··· 425 425 rsp = (unsigned long) ka->sa.sa_restorer; 426 426 } 427 427 428 - return (void __user *)((rsp - frame_size) & -8UL); 428 + rsp -= frame_size; 429 + /* Align the stack pointer according to the i386 ABI, 430 + * i.e. so that on function entry ((sp + 4) & 15) == 0. */ 431 + rsp = ((rsp + 4) & -16ul) - 4; 432 + return (void __user *) rsp; 429 433 } 430 434 431 435 int ia32_setup_frame(int sig, struct k_sigaction *ka,