From 69ec55a8553c83add3eafe0e2bf0305f2219ca6a Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Thu, 19 Oct 2000 21:38:23 +0000 Subject: Fix 32-bit sigaltstack(2). This was breaking a number of programs, some of them silently. --- arch/mips64/kernel/signal32.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'arch/mips64/kernel') diff --git a/arch/mips64/kernel/signal32.c b/arch/mips64/kernel/signal32.c index b3de6d4c9..548f271b5 100644 --- a/arch/mips64/kernel/signal32.c +++ b/arch/mips64/kernel/signal32.c @@ -60,7 +60,7 @@ struct sigaction32 { /* IRIX compatible stack_t */ typedef struct sigaltstack32 { - void *ss_sp; + s32 ss_sp; __kernel_size_t32 ss_size; int ss_flags; } stack32_t; @@ -272,11 +272,13 @@ sys32_sigaltstack(abi64_no_regargs, struct pt_regs regs) stack_t kss, koss; int ret, err = 0; mm_segment_t old_fs = get_fs(); + s32 sp; if (uss) { if (!access_ok(VERIFY_READ, uss, sizeof(*uss))) return -EFAULT; - err |= __get_user(kss.ss_sp, &uss->ss_sp); + err |= __get_user(sp, &uss->ss_sp); + kss.ss_size = (long) sp; err |= __get_user(kss.ss_size, &uss->ss_size); err |= __get_user(kss.ss_flags, &uss->ss_flags); if (err) @@ -290,7 +292,8 @@ sys32_sigaltstack(abi64_no_regargs, struct pt_regs regs) if (!ret && uoss) { if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss))) return -EFAULT; - err |= __put_user(koss.ss_sp, &uoss->ss_sp); + sp = (int) (long) koss.ss_sp; + err |= __put_user(sp, &uoss->ss_sp); err |= __put_user(koss.ss_size, &uoss->ss_size); err |= __put_user(koss.ss_flags, &uoss->ss_flags); if (err) -- cgit v1.2.3