Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

y2038: syscalls: change remaining timeval to __kernel_old_timeval

All of the remaining syscalls that pass a timeval (gettimeofday, utime,
futimesat) can trivially be changed to pass a __kernel_old_timeval
instead, which has a compatible layout, but avoids ambiguity with
the timeval type in user space.

Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+20 -19
+2 -1
arch/powerpc/include/asm/asm-prototypes.h
··· 92 92 long sys_debug_setcontext(struct ucontext __user *ctx, 93 93 int ndbg, struct sig_dbg_op __user *dbg); 94 94 int 95 - ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct timeval __user *tvp); 95 + ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, 96 + struct __kernel_old_timeval __user *tvp); 96 97 unsigned long __init early_init(unsigned long dt_ptr); 97 98 void __init machine_init(u64 dt_ptr); 98 99 #endif
+2 -2
arch/powerpc/kernel/syscalls.c
··· 79 79 * sys_select() with the appropriate args. -- Cort 80 80 */ 81 81 int 82 - ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct timeval __user *tvp) 82 + ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct __kernel_old_timeval __user *tvp) 83 83 { 84 84 if ( (unsigned long)n >= 4096 ) 85 85 { ··· 89 89 || __get_user(inp, ((fd_set __user * __user *)(buffer+1))) 90 90 || __get_user(outp, ((fd_set __user * __user *)(buffer+2))) 91 91 || __get_user(exp, ((fd_set __user * __user *)(buffer+3))) 92 - || __get_user(tvp, ((struct timeval __user * __user *)(buffer+4)))) 92 + || __get_user(tvp, ((struct __kernel_old_timeval __user * __user *)(buffer+4)))) 93 93 return -EFAULT; 94 94 } 95 95 return sys_select(n, inp, outp, exp, tvp);
+5 -5
fs/select.c
··· 321 321 switch (pt_type) { 322 322 case PT_TIMEVAL: 323 323 { 324 - struct timeval rtv; 324 + struct __kernel_old_timeval rtv; 325 325 326 326 if (sizeof(rtv) > sizeof(rtv.tv_sec) + sizeof(rtv.tv_usec)) 327 327 memset(&rtv, 0, sizeof(rtv)); ··· 698 698 } 699 699 700 700 static int kern_select(int n, fd_set __user *inp, fd_set __user *outp, 701 - fd_set __user *exp, struct timeval __user *tvp) 701 + fd_set __user *exp, struct __kernel_old_timeval __user *tvp) 702 702 { 703 703 struct timespec64 end_time, *to = NULL; 704 - struct timeval tv; 704 + struct __kernel_old_timeval tv; 705 705 int ret; 706 706 707 707 if (tvp) { ··· 720 720 } 721 721 722 722 SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp, 723 - fd_set __user *, exp, struct timeval __user *, tvp) 723 + fd_set __user *, exp, struct __kernel_old_timeval __user *, tvp) 724 724 { 725 725 return kern_select(n, inp, outp, exp, tvp); 726 726 } ··· 810 810 struct sel_arg_struct { 811 811 unsigned long n; 812 812 fd_set __user *inp, *outp, *exp; 813 - struct timeval __user *tvp; 813 + struct __kernel_old_timeval __user *tvp; 814 814 }; 815 815 816 816 SYSCALL_DEFINE1(old_select, struct sel_arg_struct __user *, arg)
+4 -4
fs/utimes.c
··· 161 161 * utimensat() instead. 162 162 */ 163 163 static long do_futimesat(int dfd, const char __user *filename, 164 - struct timeval __user *utimes) 164 + struct __kernel_old_timeval __user *utimes) 165 165 { 166 - struct timeval times[2]; 166 + struct __kernel_old_timeval times[2]; 167 167 struct timespec64 tstimes[2]; 168 168 169 169 if (utimes) { ··· 190 190 191 191 192 192 SYSCALL_DEFINE3(futimesat, int, dfd, const char __user *, filename, 193 - struct timeval __user *, utimes) 193 + struct __kernel_old_timeval __user *, utimes) 194 194 { 195 195 return do_futimesat(dfd, filename, utimes); 196 196 } 197 197 198 198 SYSCALL_DEFINE2(utimes, char __user *, filename, 199 - struct timeval __user *, utimes) 199 + struct __kernel_old_timeval __user *, utimes) 200 200 { 201 201 return do_futimesat(AT_FDCWD, filename, utimes); 202 202 }
+5 -5
include/linux/syscalls.h
··· 51 51 struct __sysctl_args; 52 52 struct sysinfo; 53 53 struct timespec; 54 - struct timeval; 54 + struct __kernel_old_timeval; 55 55 struct __kernel_timex; 56 56 struct timezone; 57 57 struct tms; ··· 732 732 asmlinkage long sys_getcpu(unsigned __user *cpu, unsigned __user *node, struct getcpu_cache __user *cache); 733 733 734 734 /* kernel/time.c */ 735 - asmlinkage long sys_gettimeofday(struct timeval __user *tv, 735 + asmlinkage long sys_gettimeofday(struct __kernel_old_timeval __user *tv, 736 736 struct timezone __user *tz); 737 737 asmlinkage long sys_settimeofday(struct timeval __user *tv, 738 738 struct timezone __user *tz); ··· 1082 1082 asmlinkage long sys_utime(char __user *filename, 1083 1083 struct utimbuf __user *times); 1084 1084 asmlinkage long sys_utimes(char __user *filename, 1085 - struct timeval __user *utimes); 1085 + struct __kernel_old_timeval __user *utimes); 1086 1086 asmlinkage long sys_futimesat(int dfd, const char __user *filename, 1087 - struct timeval __user *utimes); 1087 + struct __kernel_old_timeval __user *utimes); 1088 1088 #endif 1089 1089 asmlinkage long sys_futimesat_time32(unsigned int dfd, 1090 1090 const char __user *filename, ··· 1098 1098 struct linux_dirent __user *dirent, 1099 1099 unsigned int count); 1100 1100 asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp, 1101 - fd_set __user *exp, struct timeval __user *tvp); 1101 + fd_set __user *exp, struct __kernel_old_timeval __user *tvp); 1102 1102 asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds, 1103 1103 int timeout); 1104 1104 asmlinkage long sys_epoll_wait(int epfd, struct epoll_event __user *events,
+1 -1
kernel/power/power.h
··· 179 179 extern int swsusp_unmark(void); 180 180 #endif 181 181 182 - struct timeval; 182 + struct __kernel_old_timeval; 183 183 /* kernel/power/swsusp.c */ 184 184 extern void swsusp_show_speed(ktime_t, ktime_t, unsigned int, char *); 185 185
+1 -1
kernel/time/time.c
··· 137 137 #endif /* __ARCH_WANT_SYS_TIME32 */ 138 138 #endif 139 139 140 - SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv, 140 + SYSCALL_DEFINE2(gettimeofday, struct __kernel_old_timeval __user *, tv, 141 141 struct timezone __user *, tz) 142 142 { 143 143 if (likely(tv != NULL)) {