itimers: Move compat itimer syscalls to native ones
get rid of set_fs(), sanitize compat copyin/copyout. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: John Stultz <john.stultz@linaro.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/20170607084241.28657-12-viro@ZenIV.linux.org.uk
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include <linux/posix-timers.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <trace/events/timer.h>
|
||||
#include <linux/compat.h>
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
@@ -116,6 +117,19 @@ SYSCALL_DEFINE2(getitimer, int, which, struct itimerval __user *, value)
|
||||
return error;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
COMPAT_SYSCALL_DEFINE2(getitimer, int, which,
|
||||
struct compat_itimerval __user *, it)
|
||||
{
|
||||
struct itimerval kit;
|
||||
int error = do_getitimer(which, &kit);
|
||||
|
||||
if (!error && put_compat_itimerval(it, &kit))
|
||||
error = -EFAULT;
|
||||
return error;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* The timer is automagically restarted, when interval != 0
|
||||
@@ -294,3 +308,27 @@ SYSCALL_DEFINE3(setitimer, int, which, struct itimerval __user *, value,
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
COMPAT_SYSCALL_DEFINE3(setitimer, int, which,
|
||||
struct compat_itimerval __user *, in,
|
||||
struct compat_itimerval __user *, out)
|
||||
{
|
||||
struct itimerval kin, kout;
|
||||
int error;
|
||||
|
||||
if (in) {
|
||||
if (get_compat_itimerval(&kin, in))
|
||||
return -EFAULT;
|
||||
} else {
|
||||
memset(&kin, 0, sizeof(kin));
|
||||
}
|
||||
|
||||
error = do_setitimer(which, &kin, out ? &kout : NULL);
|
||||
if (error || !out)
|
||||
return error;
|
||||
if (put_compat_itimerval(out, &kout))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user