On Tuesday 26 May 2015 18:08:29 Baolin Wang wrote:
+SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
const struct itimerspec __user *, new_setting,struct itimerspec __user *, old_setting)+{
struct itimerspec new_spec, old_spec;int error = 0;struct itimerspec *rtn = old_setting ? &old_spec : NULL;if (!new_setting)return -EINVAL;if (copy_from_user(&new_spec, new_setting, sizeof (new_spec)))return -EFAULT;if (!timespec_valid(&new_spec.it_interval) ||!timespec_valid(&new_spec.it_value))return -EINVAL;error = __timer_settime(timer_id, flags, &new_spec, rtn);if (old_setting && !error && copy_to_user(old_setting, &old_spec, sizeof (old_spec))) error = -EFAULT;
Since this is meant as preparation for adding the compat syscalls, I think the actual syscall code here should be as small as possible.
In order to do that, it would be better to have the timespec_valid calls inside of __timer_settime.
Arnd