diff options
| -rw-r--r-- | kernel/posix-timers.c | 16 | 
1 files changed, 12 insertions, 4 deletions
diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c index a4dbfe71c5a..c1e2636f9e4 100644 --- a/kernel/posix-timers.c +++ b/kernel/posix-timers.c @@ -253,6 +253,7 @@ static __init int init_posix_timers(void)  		.nsleep_restart	= hrtimer_nanosleep_restart,  		.timer_create	= common_timer_create,  		.timer_set	= common_timer_set, +		.timer_get	= common_timer_get,  	};  	struct k_clock clock_monotonic = {  		.clock_getres	= hrtimer_get_res, @@ -261,6 +262,7 @@ static __init int init_posix_timers(void)  		.nsleep_restart	= hrtimer_nanosleep_restart,  		.timer_create	= common_timer_create,  		.timer_set	= common_timer_set, +		.timer_get	= common_timer_get,  	};  	struct k_clock clock_monotonic_raw = {  		.clock_getres	= hrtimer_get_res, @@ -712,22 +714,28 @@ common_timer_get(struct k_itimer *timr, struct itimerspec *cur_setting)  SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,  		struct itimerspec __user *, setting)  { -	struct k_itimer *timr;  	struct itimerspec cur_setting; +	struct k_itimer *timr; +	struct k_clock *kc;  	unsigned long flags; +	int ret = 0;  	timr = lock_timer(timer_id, &flags);  	if (!timr)  		return -EINVAL; -	CLOCK_DISPATCH(timr->it_clock, timer_get, (timr, &cur_setting)); +	kc = clockid_to_kclock(timr->it_clock); +	if (WARN_ON_ONCE(!kc || !kc->timer_get)) +		ret = -EINVAL; +	else +		kc->timer_get(timr, &cur_setting);  	unlock_timer(timr, flags); -	if (copy_to_user(setting, &cur_setting, sizeof (cur_setting))) +	if (!ret && copy_to_user(setting, &cur_setting, sizeof (cur_setting)))  		return -EFAULT; -	return 0; +	return ret;  }  /*  |