rt_sigtimedwait(): move compat to native
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 31 May 2017 08:46:17 +0000 (04:46 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 10 Jun 2017 03:57:12 +0000 (23:57 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
include/linux/signal.h
kernel/compat.c
kernel/signal.c

index 1f5a16620693a644281d6e108c256de0800f977a..231603ac20a368f2d130ddb0a7d0a0ebd9a30d03 100644 (file)
@@ -246,8 +246,6 @@ extern int do_send_sig_info(int sig, struct siginfo *info,
                                struct task_struct *p, bool group);
 extern int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p);
 extern int __group_send_sig_info(int, struct siginfo *, struct task_struct *);
-extern int do_sigtimedwait(const sigset_t *, siginfo_t *,
-                               const struct timespec *);
 extern int sigprocmask(int, sigset_t *, sigset_t *);
 extern void set_current_blocked(sigset_t *);
 extern void __set_current_blocked(const sigset_t *);
index 64e772aabdb5f8e8d736ad730a4f02bc1e3087fa..36e6e7c405e34430512ed79ea4d55a56a0b55b8a 100644 (file)
@@ -866,38 +866,6 @@ sigset_to_compat(compat_sigset_t *compat, const sigset_t *set)
        }
 }
 
-COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese,
-               struct compat_siginfo __user *, uinfo,
-               struct compat_timespec __user *, uts, compat_size_t, sigsetsize)
-{
-       compat_sigset_t s32;
-       sigset_t s;
-       struct timespec t;
-       siginfo_t info;
-       long ret;
-
-       if (sigsetsize != sizeof(sigset_t))
-               return -EINVAL;
-
-       if (copy_from_user(&s32, uthese, sizeof(compat_sigset_t)))
-               return -EFAULT;
-       sigset_from_compat(&s, &s32);
-
-       if (uts) {
-               if (compat_get_timespec(&t, uts))
-                       return -EFAULT;
-       }
-
-       ret = do_sigtimedwait(&s, &info, uts ? &t : NULL);
-
-       if (ret > 0 && uinfo) {
-               if (copy_siginfo_to_user32(uinfo, &info))
-                       ret = -EFAULT;
-       }
-
-       return ret;
-}
-
 #ifdef __ARCH_WANT_COMPAT_SYS_TIME
 
 /* compat_time_t is a 32 bit "long" and needs to get converted. */
index 6237f492adfca6f07fb1f075bbf957ba61bda26d..fe5b3608c31cfb9066437c63550a07ccc1513a64 100644 (file)
@@ -2768,7 +2768,7 @@ int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from)
  *  @info: if non-null, the signal's siginfo is returned here
  *  @ts: upper bound on process time suspension
  */
-int do_sigtimedwait(const sigset_t *which, siginfo_t *info,
+static int do_sigtimedwait(const sigset_t *which, siginfo_t *info,
                    const struct timespec *ts)
 {
        ktime_t *to = NULL, timeout = KTIME_MAX;
@@ -2857,6 +2857,40 @@ SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese,
        return ret;
 }
 
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese,
+               struct compat_siginfo __user *, uinfo,
+               struct compat_timespec __user *, uts, compat_size_t, sigsetsize)
+{
+       compat_sigset_t s32;
+       sigset_t s;
+       struct timespec t;
+       siginfo_t info;
+       long ret;
+
+       if (sigsetsize != sizeof(sigset_t))
+               return -EINVAL;
+
+       if (copy_from_user(&s32, uthese, sizeof(compat_sigset_t)))
+               return -EFAULT;
+       sigset_from_compat(&s, &s32);
+
+       if (uts) {
+               if (compat_get_timespec(&t, uts))
+                       return -EFAULT;
+       }
+
+       ret = do_sigtimedwait(&s, &info, uts ? &t : NULL);
+
+       if (ret > 0 && uinfo) {
+               if (copy_siginfo_to_user32(uinfo, &info))
+                       ret = -EFAULT;
+       }
+
+       return ret;
+}
+#endif
+
 /**
  *  sys_kill - send a signal to a process
  *  @pid: the PID of the process