summaryrefslogtreecommitdiffstats
path: root/arch/mips64/kernel
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-10-19 21:38:23 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-10-19 21:38:23 +0000
commit69ec55a8553c83add3eafe0e2bf0305f2219ca6a (patch)
treefdf8de20710f4661bdc9c2a91252a09df7407b53 /arch/mips64/kernel
parentb6557eff13f03205b7ce25760a78583323090932 (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.c9
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)