mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
[PATCH] uml: fix signal frame alignment
Use the same signal frame alignment calculations as the underlying architecture. x86_64 appeared to do this, but the "- 8" was really subtracting 8 * sizeof(struct rt_sigframe) rather than 8 bytes. UML/i386 might have been OK, but I changed the calculation to match i386 just to be sure. Signed-off-by: Jeff Dike <jdike@addtoit.com> Cc: <stable@kernel.org> Cc: Adrian Bunk <bunk@stusta.de> Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Acked-by: Antoine Martin <antoine@nagafix.co.uk> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
99abaf51e2
commit
3896625d0b
@ -219,7 +219,8 @@ int setup_signal_stack_sc(unsigned long stack_top, int sig,
|
||||
unsigned long save_sp = PT_REGS_SP(regs);
|
||||
int err = 0;
|
||||
|
||||
stack_top &= -8UL;
|
||||
/* This is the same calculation as i386 - ((sp + 4) & 15) == 0 */
|
||||
stack_top = ((stack_top + 4) & -16UL) - 4;
|
||||
frame = (struct sigframe __user *) stack_top - 1;
|
||||
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
|
||||
return 1;
|
||||
|
@ -191,8 +191,9 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,
|
||||
struct task_struct *me = current;
|
||||
|
||||
frame = (struct rt_sigframe __user *)
|
||||
round_down(stack_top - sizeof(struct rt_sigframe), 16) - 8;
|
||||
frame = (struct rt_sigframe __user *) ((unsigned long) frame - 128);
|
||||
round_down(stack_top - sizeof(struct rt_sigframe), 16);
|
||||
/* Subtract 128 for a red zone and 8 for proper alignment */
|
||||
frame = (struct rt_sigframe __user *) ((unsigned long) frame - 128 - 8);
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, fp, sizeof(struct _fpstate)))
|
||||
goto out;
|
||||
|
Loading…
Reference in New Issue
Block a user