compat: Enable compat_get/put_timespec64 always
These functions are used in the repurposed compat syscalls to provide backward compatibility for using 32 bit time_t on 32 bit systems. Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
		
							parent
							
								
									0d55303c51
								
							
						
					
					
						commit
						1c68adf61e
					
				| @ -294,8 +294,6 @@ extern int compat_get_timespec(struct timespec *, const void __user *); | ||||
| extern int compat_put_timespec(const struct timespec *, void __user *); | ||||
| extern int compat_get_timeval(struct timeval *, const void __user *); | ||||
| extern int compat_put_timeval(const struct timeval *, void __user *); | ||||
| extern int compat_get_timespec64(struct timespec64 *, const void __user *); | ||||
| extern int compat_put_timespec64(const struct timespec64 *, void __user *); | ||||
| extern int get_compat_itimerspec64(struct itimerspec64 *its, | ||||
| 			const struct compat_itimerspec __user *uits); | ||||
| extern int put_compat_itimerspec64(const struct itimerspec64 *its, | ||||
|  | ||||
| @ -3,6 +3,7 @@ | ||||
| #define _LINUX_COMPAT_TIME_H | ||||
| 
 | ||||
| #include <linux/types.h> | ||||
| #include <linux/time64.h> | ||||
| 
 | ||||
| typedef s32		compat_time_t; | ||||
| 
 | ||||
| @ -16,4 +17,7 @@ struct compat_timeval { | ||||
| 	s32		tv_usec; | ||||
| }; | ||||
| 
 | ||||
| extern int compat_get_timespec64(struct timespec64 *, const void __user *); | ||||
| extern int compat_put_timespec64(const struct timespec64 *, void __user *); | ||||
| 
 | ||||
| #endif /* _LINUX_COMPAT_TIME_H */ | ||||
|  | ||||
| @ -120,50 +120,6 @@ static int __compat_put_timespec(const struct timespec *ts, struct compat_timesp | ||||
| 			__put_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0; | ||||
| } | ||||
| 
 | ||||
| static int __compat_get_timespec64(struct timespec64 *ts64, | ||||
| 				   const struct compat_timespec __user *cts) | ||||
| { | ||||
| 	struct compat_timespec ts; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	ret = copy_from_user(&ts, cts, sizeof(ts)); | ||||
| 	if (ret) | ||||
| 		return -EFAULT; | ||||
| 
 | ||||
| 	ts64->tv_sec = ts.tv_sec; | ||||
| 	ts64->tv_nsec = ts.tv_nsec; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int __compat_put_timespec64(const struct timespec64 *ts64, | ||||
| 				   struct compat_timespec __user *cts) | ||||
| { | ||||
| 	struct compat_timespec ts = { | ||||
| 		.tv_sec = ts64->tv_sec, | ||||
| 		.tv_nsec = ts64->tv_nsec | ||||
| 	}; | ||||
| 	return copy_to_user(cts, &ts, sizeof(ts)) ? -EFAULT : 0; | ||||
| } | ||||
| 
 | ||||
| int compat_get_timespec64(struct timespec64 *ts, const void __user *uts) | ||||
| { | ||||
| 	if (COMPAT_USE_64BIT_TIME) | ||||
| 		return copy_from_user(ts, uts, sizeof(*ts)) ? -EFAULT : 0; | ||||
| 	else | ||||
| 		return __compat_get_timespec64(ts, uts); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(compat_get_timespec64); | ||||
| 
 | ||||
| int compat_put_timespec64(const struct timespec64 *ts, void __user *uts) | ||||
| { | ||||
| 	if (COMPAT_USE_64BIT_TIME) | ||||
| 		return copy_to_user(uts, ts, sizeof(*ts)) ? -EFAULT : 0; | ||||
| 	else | ||||
| 		return __compat_put_timespec64(ts, uts); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(compat_put_timespec64); | ||||
| 
 | ||||
| int compat_get_timeval(struct timeval *tv, const void __user *utv) | ||||
| { | ||||
| 	if (COMPAT_USE_64BIT_TIME) | ||||
| @ -367,6 +323,14 @@ COMPAT_SYSCALL_DEFINE3(sched_getaffinity, compat_pid_t,  pid, unsigned int, len, | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /* Todo: Delete these extern declarations when get/put_compat_itimerspec64()
 | ||||
|  * are moved to kernel/time/time.c . | ||||
|  */ | ||||
| extern int __compat_get_timespec64(struct timespec64 *ts64, | ||||
| 				   const struct compat_timespec __user *cts); | ||||
| extern int __compat_put_timespec64(const struct timespec64 *ts64, | ||||
| 				   struct compat_timespec __user *cts); | ||||
| 
 | ||||
| int get_compat_itimerspec64(struct itimerspec64 *its, | ||||
| 			const struct compat_itimerspec __user *uits) | ||||
| { | ||||
|  | ||||
| @ -880,6 +880,50 @@ int put_timespec64(const struct timespec64 *ts, | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(put_timespec64); | ||||
| 
 | ||||
| int __compat_get_timespec64(struct timespec64 *ts64, | ||||
| 				   const struct compat_timespec __user *cts) | ||||
| { | ||||
| 	struct compat_timespec ts; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	ret = copy_from_user(&ts, cts, sizeof(ts)); | ||||
| 	if (ret) | ||||
| 		return -EFAULT; | ||||
| 
 | ||||
| 	ts64->tv_sec = ts.tv_sec; | ||||
| 	ts64->tv_nsec = ts.tv_nsec; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int __compat_put_timespec64(const struct timespec64 *ts64, | ||||
| 				   struct compat_timespec __user *cts) | ||||
| { | ||||
| 	struct compat_timespec ts = { | ||||
| 		.tv_sec = ts64->tv_sec, | ||||
| 		.tv_nsec = ts64->tv_nsec | ||||
| 	}; | ||||
| 	return copy_to_user(cts, &ts, sizeof(ts)) ? -EFAULT : 0; | ||||
| } | ||||
| 
 | ||||
| int compat_get_timespec64(struct timespec64 *ts, const void __user *uts) | ||||
| { | ||||
| 	if (COMPAT_USE_64BIT_TIME) | ||||
| 		return copy_from_user(ts, uts, sizeof(*ts)) ? -EFAULT : 0; | ||||
| 	else | ||||
| 		return __compat_get_timespec64(ts, uts); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(compat_get_timespec64); | ||||
| 
 | ||||
| int compat_put_timespec64(const struct timespec64 *ts, void __user *uts) | ||||
| { | ||||
| 	if (COMPAT_USE_64BIT_TIME) | ||||
| 		return copy_to_user(uts, ts, sizeof(*ts)) ? -EFAULT : 0; | ||||
| 	else | ||||
| 		return __compat_put_timespec64(ts, uts); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(compat_put_timespec64); | ||||
| 
 | ||||
| int get_itimerspec64(struct itimerspec64 *it, | ||||
| 			const struct itimerspec __user *uit) | ||||
| { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user