Skip to content

Commit

Permalink
rt_sigtimedwait(): move compat to native
Browse files Browse the repository at this point in the history
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Al Viro committed Jun 10, 2017
1 parent 464d624 commit 1b3c872
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 35 deletions.
2 changes: 0 additions & 2 deletions include/linux/signal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
Expand Down
32 changes: 0 additions & 32 deletions kernel/compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
36 changes: 35 additions & 1 deletion kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 1b3c872

Please sign in to comment.