|
@@ -2454,11 +2454,9 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
|
|
stack_t oss;
|
|
stack_t oss;
|
|
int error;
|
|
int error;
|
|
|
|
|
|
- if (uoss) {
|
|
|
|
- oss.ss_sp = (void __user *) current->sas_ss_sp;
|
|
|
|
- oss.ss_size = current->sas_ss_size;
|
|
|
|
- oss.ss_flags = sas_ss_flags(sp);
|
|
|
|
- }
|
|
|
|
|
|
+ oss.ss_sp = (void __user *) current->sas_ss_sp;
|
|
|
|
+ oss.ss_size = current->sas_ss_size;
|
|
|
|
+ oss.ss_flags = sas_ss_flags(sp);
|
|
|
|
|
|
if (uss) {
|
|
if (uss) {
|
|
void __user *ss_sp;
|
|
void __user *ss_sp;
|
|
@@ -2501,13 +2499,16 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
|
|
current->sas_ss_size = ss_size;
|
|
current->sas_ss_size = ss_size;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ error = 0;
|
|
if (uoss) {
|
|
if (uoss) {
|
|
error = -EFAULT;
|
|
error = -EFAULT;
|
|
- if (copy_to_user(uoss, &oss, sizeof(oss)))
|
|
|
|
|
|
+ if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
|
|
goto out;
|
|
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:
|
|
out:
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|