mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 14:12:06 +00:00
rt_sigtimedwait(): move compat to native
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
464d62421c
commit
1b3c872c83
@ -246,8 +246,6 @@ extern int do_send_sig_info(int sig, struct siginfo *info,
|
|||||||
struct task_struct *p, bool group);
|
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 sig, struct siginfo *info, struct task_struct *p);
|
||||||
extern int __group_send_sig_info(int, struct siginfo *, struct task_struct *);
|
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 int sigprocmask(int, sigset_t *, sigset_t *);
|
||||||
extern void set_current_blocked(sigset_t *);
|
extern void set_current_blocked(sigset_t *);
|
||||||
extern void __set_current_blocked(const sigset_t *);
|
extern void __set_current_blocked(const sigset_t *);
|
||||||
|
@ -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
|
#ifdef __ARCH_WANT_COMPAT_SYS_TIME
|
||||||
|
|
||||||
/* compat_time_t is a 32 bit "long" and needs to get converted. */
|
/* compat_time_t is a 32 bit "long" and needs to get converted. */
|
||||||
|
@ -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
|
* @info: if non-null, the signal's siginfo is returned here
|
||||||
* @ts: upper bound on process time suspension
|
* @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)
|
const struct timespec *ts)
|
||||||
{
|
{
|
||||||
ktime_t *to = NULL, timeout = KTIME_MAX;
|
ktime_t *to = NULL, timeout = KTIME_MAX;
|
||||||
@ -2857,6 +2857,40 @@ SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese,
|
|||||||
return ret;
|
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
|
* sys_kill - send a signal to a process
|
||||||
* @pid: the PID of the process
|
* @pid: the PID of the process
|
||||||
|
Loading…
Reference in New Issue
Block a user