Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
[sfrench/cifs-2.6.git] / kernel / signal.c
index 049a482e705c4b495d04036e5c030ad5f497d9da..47491aa3e790f00131c2e0dc1e74d3b5c7f488a8 100644 (file)
@@ -3569,9 +3569,8 @@ int __save_altstack(stack_t __user *uss, unsigned long sp)
 }
 
 #ifdef CONFIG_COMPAT
-COMPAT_SYSCALL_DEFINE2(sigaltstack,
-                       const compat_stack_t __user *, uss_ptr,
-                       compat_stack_t __user *, uoss_ptr)
+static int do_compat_sigaltstack(const compat_stack_t __user *uss_ptr,
+                                compat_stack_t __user *uoss_ptr)
 {
        stack_t uss, uoss;
        int ret;
@@ -3598,9 +3597,16 @@ COMPAT_SYSCALL_DEFINE2(sigaltstack,
        return ret;
 }
 
+COMPAT_SYSCALL_DEFINE2(sigaltstack,
+                       const compat_stack_t __user *, uss_ptr,
+                       compat_stack_t __user *, uoss_ptr)
+{
+       return do_compat_sigaltstack(uss_ptr, uoss_ptr);
+}
+
 int compat_restore_altstack(const compat_stack_t __user *uss)
 {
-       int err = compat_sys_sigaltstack(uss, NULL);
+       int err = do_compat_sigaltstack(uss, NULL);
        /* squash all but -EFAULT for now */
        return err == -EFAULT ? err : 0;
 }
@@ -3625,11 +3631,20 @@ int __compat_save_altstack(compat_stack_t __user *uss, unsigned long sp)
 
 /**
  *  sys_sigpending - examine pending signals
- *  @set: where mask of pending signal is returned
+ *  @uset: where mask of pending signal is returned
  */
-SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, set)
+SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, uset)
 {
-       return sys_rt_sigpending((sigset_t __user *)set, sizeof(old_sigset_t)); 
+       sigset_t set;
+       int err;
+
+       if (sizeof(old_sigset_t) > sizeof(*uset))
+               return -EINVAL;
+
+       err = do_sigpending(&set);
+       if (!err && copy_to_user(uset, &set, sizeof(old_sigset_t)))
+               err = -EFAULT;
+       return err;
 }
 
 #ifdef CONFIG_COMPAT