aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/signal.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index dff04d7d6dc55c..e392acc5472833 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -1143,11 +1143,9 @@ do_sigaltstack (const stack_t *uss, stack_t *uoss, unsigned long sp)
stack_t oss;
int error;
- if (uoss) {
- oss.ss_sp = (void *) current->sas_ss_sp;
- oss.ss_size = current->sas_ss_size;
- oss.ss_flags = sas_ss_flags(sp);
- }
+ oss.ss_sp = (void *) current->sas_ss_sp;
+ oss.ss_size = current->sas_ss_size;
+ oss.ss_flags = sas_ss_flags(sp);
if (uss) {
void *ss_sp;
@@ -1190,13 +1188,16 @@ do_sigaltstack (const stack_t *uss, stack_t *uoss, unsigned long sp)
current->sas_ss_size = ss_size;
}
+ error = 0;
if (uoss) {
error = -EFAULT;
- if (copy_to_user(uoss, &oss, sizeof(oss)))
+ if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
goto out;
+ error = __put_user(oss.ss_sp, &uoss->ss_sp) |
+ __put_user(oss.ss_size, &uoss->ss_size) |
+ __put_user(oss.ss_flags, &uoss->ss_flags);
}
- error = 0;
out:
return error;
}