Merge branch 'kmemleak' of git://linux-arm.org/linux-2.6
[pandora-kernel.git] / kernel / signal.c
index ccf1cee..64c5dee 100644 (file)
@@ -2454,11 +2454,9 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
        stack_t oss;
        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) {
                void __user *ss_sp;
@@ -2466,10 +2464,12 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
                int ss_flags;
 
                error = -EFAULT;
-               if (!access_ok(VERIFY_READ, uss, sizeof(*uss))
-                   || __get_user(ss_sp, &uss->ss_sp)
-                   || __get_user(ss_flags, &uss->ss_flags)
-                   || __get_user(ss_size, &uss->ss_size))
+               if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
+                       goto out;
+               error = __get_user(ss_sp, &uss->ss_sp) |
+                       __get_user(ss_flags, &uss->ss_flags) |
+                       __get_user(ss_size, &uss->ss_size);
+               if (error)
                        goto out;
 
                error = -EPERM;
@@ -2501,13 +2501,16 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
                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;
 }