diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-10-19 21:38:23 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-10-19 21:38:23 +0000 |
commit | 69ec55a8553c83add3eafe0e2bf0305f2219ca6a (patch) | |
tree | fdf8de20710f4661bdc9c2a91252a09df7407b53 /arch/mips64/kernel | |
parent | b6557eff13f03205b7ce25760a78583323090932 (diff) |
Fix 32-bit sigaltstack(2). This was breaking a number of programs,
some of them silently.
Diffstat (limited to 'arch/mips64/kernel')
-rw-r--r-- | arch/mips64/kernel/signal32.c | 9 |
1 files changed, 6 insertions, 3 deletions
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) |