Commit d7fc6225 authored by Arun Sharma's avatar Arun Sharma Committed by David Mosberger

[PATCH] ia64: IA-32 sigaltstack bug fix

More code needs to be guarded by if (uss32) { ... }. Without this
patch, if (buf32..) may be checking uninitialized data and may result
in spurious ENOMEMs.
Signed-off-by: default avatarGordon Jin <gordon.jin@intel.com>
Signed-off-by: default avatarArun Sharma <arun.sharma@intel.com>
Signed-off-by: default avatarDavid Mosberger <davidm@hpl.hp.com>
parent b3e3d3e0
...@@ -1996,18 +1996,19 @@ sys32_sigaltstack (ia32_stack_t *uss32, ia32_stack_t *uoss32, ...@@ -1996,18 +1996,19 @@ sys32_sigaltstack (ia32_stack_t *uss32, ia32_stack_t *uoss32,
int ret; int ret;
mm_segment_t old_fs = get_fs(); mm_segment_t old_fs = get_fs();
if (uss32) if (uss32) {
if (copy_from_user(&buf32, uss32, sizeof(ia32_stack_t))) if (copy_from_user(&buf32, uss32, sizeof(ia32_stack_t)))
return -EFAULT; return -EFAULT;
uss.ss_sp = (void *) (long) buf32.ss_sp; uss.ss_sp = (void *) (long) buf32.ss_sp;
uss.ss_flags = buf32.ss_flags; uss.ss_flags = buf32.ss_flags;
/* MINSIGSTKSZ is different for ia32 vs ia64. We lie here to pass the /* MINSIGSTKSZ is different for ia32 vs ia64. We lie here to pass the
check and set it to the user requested value later */ check and set it to the user requested value later */
if ((buf32.ss_flags != SS_DISABLE) && (buf32.ss_size < MINSIGSTKSZ_IA32)) { if ((buf32.ss_flags != SS_DISABLE) && (buf32.ss_size < MINSIGSTKSZ_IA32)) {
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
}
uss.ss_size = MINSIGSTKSZ;
} }
uss.ss_size = MINSIGSTKSZ;
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
ret = do_sigaltstack(uss32 ? &uss : NULL, &uoss, pt->r12); ret = do_sigaltstack(uss32 ? &uss : NULL, &uoss, pt->r12);
current->sas_ss_size = buf32.ss_size; current->sas_ss_size = buf32.ss_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment