break;
 
        case PTRACE_SETSIGINFO:
-               if (copy_from_user(&siginfo, datavp, sizeof siginfo))
-                       ret = -EFAULT;
-               else
+               ret = copy_siginfo_from_user(&siginfo, datavp);
+               if (!ret)
                        ret = ptrace_setsiginfo(child, &siginfo);
                break;
 
                break;
 
        case PTRACE_SETSIGINFO:
-               if (copy_siginfo_from_user32(
-                           &siginfo, (struct compat_siginfo __user *) datap))
-                       ret = -EFAULT;
-               else
+               ret = copy_siginfo_from_user32(
+                       &siginfo, (struct compat_siginfo __user *) datap);
+               if (!ret)
                        ret = ptrace_setsiginfo(child, &siginfo);
                break;
 #ifdef CONFIG_HAVE_ARCH_TRACEHOOK
 
        return 0;
 }
 
+int copy_siginfo_from_user(siginfo_t *to, const siginfo_t __user *from)
+{
+       if (copy_from_user(to, from, sizeof(struct siginfo)))
+               return -EFAULT;
+       return 0;
+}
+
 #ifdef CONFIG_COMPAT
 int copy_siginfo_to_user32(struct compat_siginfo __user *to,
                           const struct siginfo *from)
                siginfo_t __user *, uinfo)
 {
        siginfo_t info;
-       if (copy_from_user(&info, uinfo, sizeof(siginfo_t)))
-               return -EFAULT;
+       int ret = copy_siginfo_from_user(&info, uinfo);
+       if (unlikely(ret))
+               return ret;
        return do_rt_sigqueueinfo(pid, sig, &info);
 }
 
                siginfo_t __user *, uinfo)
 {
        siginfo_t info;
-
-       if (copy_from_user(&info, uinfo, sizeof(siginfo_t)))
-               return -EFAULT;
-
+       int ret = copy_siginfo_from_user(&info, uinfo);
+       if (unlikely(ret))
+               return ret;
        return do_rt_tgsigqueueinfo(tgid, pid, sig, &info);
 }
 
                        struct compat_siginfo __user *, uinfo)
 {
        siginfo_t info;
-
-       if (copy_siginfo_from_user32(&info, uinfo))
-               return -EFAULT;
+       int ret = copy_siginfo_from_user32(&info, uinfo);
+       if (unlikely(ret))
+               return ret;
        return do_rt_tgsigqueueinfo(tgid, pid, sig, &info);
 }
 #endif