y2038: syscalls: change remaining timeval to __kernel_old_timeval
authorArnd Bergmann <arnd@arndb.de>
Fri, 25 Oct 2019 20:56:17 +0000 (22:56 +0200)
committerArnd Bergmann <arnd@arndb.de>
Fri, 15 Nov 2019 13:38:29 +0000 (14:38 +0100)
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>
arch/powerpc/include/asm/asm-prototypes.h
arch/powerpc/kernel/syscalls.c
fs/select.c
fs/utimes.c
include/linux/syscalls.h
kernel/power/power.h
kernel/time/time.c

index 8561498e653cb08fd604fbad535e3dc94fcff3cc..2c25dc079cb9d70ba267e684241995e86e28b380 100644 (file)
@@ -92,7 +92,8 @@ long sys_swapcontext(struct ucontext __user *old_ctx,
 long sys_debug_setcontext(struct ucontext __user *ctx,
                          int ndbg, struct sig_dbg_op __user *dbg);
 int
-ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct timeval __user *tvp);
+ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
+          struct __kernel_old_timeval __user *tvp);
 unsigned long __init early_init(unsigned long dt_ptr);
 void __init machine_init(u64 dt_ptr);
 #endif
index 3bfb3888e89746f60f4145054041f3d28d0a3e37..078608ec2e92180aa7479de688c839e5077d81f2 100644 (file)
@@ -79,7 +79,7 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, size_t, len,
  * sys_select() with the appropriate args. -- Cort
  */
 int
-ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct timeval __user *tvp)
+ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct __kernel_old_timeval __user *tvp)
 {
        if ( (unsigned long)n >= 4096 )
        {
@@ -89,7 +89,7 @@ ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, s
                    || __get_user(inp, ((fd_set __user * __user *)(buffer+1)))
                    || __get_user(outp, ((fd_set  __user * __user *)(buffer+2)))
                    || __get_user(exp, ((fd_set  __user * __user *)(buffer+3)))
-                   || __get_user(tvp, ((struct timeval  __user * __user *)(buffer+4))))
+                   || __get_user(tvp, ((struct __kernel_old_timeval  __user * __user *)(buffer+4))))
                        return -EFAULT;
        }
        return sys_select(n, inp, outp, exp, tvp);
index 53a0c149f528391a51b9644e3bf99a5cc4b4f3cd..11d0285d46b7ed8d9ed1fa4039bc0619c6e22abb 100644 (file)
@@ -321,7 +321,7 @@ static int poll_select_finish(struct timespec64 *end_time,
        switch (pt_type) {
        case PT_TIMEVAL:
                {
-                       struct timeval rtv;
+                       struct __kernel_old_timeval rtv;
 
                        if (sizeof(rtv) > sizeof(rtv.tv_sec) + sizeof(rtv.tv_usec))
                                memset(&rtv, 0, sizeof(rtv));
@@ -698,10 +698,10 @@ out_nofds:
 }
 
 static int kern_select(int n, fd_set __user *inp, fd_set __user *outp,
-                      fd_set __user *exp, struct timeval __user *tvp)
+                      fd_set __user *exp, struct __kernel_old_timeval __user *tvp)
 {
        struct timespec64 end_time, *to = NULL;
-       struct timeval tv;
+       struct __kernel_old_timeval tv;
        int ret;
 
        if (tvp) {
@@ -720,7 +720,7 @@ static int kern_select(int n, fd_set __user *inp, fd_set __user *outp,
 }
 
 SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp,
-               fd_set __user *, exp, struct timeval __user *, tvp)
+               fd_set __user *, exp, struct __kernel_old_timeval __user *, tvp)
 {
        return kern_select(n, inp, outp, exp, tvp);
 }
@@ -810,7 +810,7 @@ SYSCALL_DEFINE6(pselect6_time32, int, n, fd_set __user *, inp, fd_set __user *,
 struct sel_arg_struct {
        unsigned long n;
        fd_set __user *inp, *outp, *exp;
-       struct timeval __user *tvp;
+       struct __kernel_old_timeval __user *tvp;
 };
 
 SYSCALL_DEFINE1(old_select, struct sel_arg_struct __user *, arg)
index 1ba3f78838704a84e063a624d6cc3497bd2b1b35..c952b6b3d8a0f342e231e6dfef1eb8d63811b51e 100644 (file)
@@ -161,9 +161,9 @@ SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename,
  * utimensat() instead.
  */
 static long do_futimesat(int dfd, const char __user *filename,
-                        struct timeval __user *utimes)
+                        struct __kernel_old_timeval __user *utimes)
 {
-       struct timeval times[2];
+       struct __kernel_old_timeval times[2];
        struct timespec64 tstimes[2];
 
        if (utimes) {
@@ -190,13 +190,13 @@ static long do_futimesat(int dfd, const char __user *filename,
 
 
 SYSCALL_DEFINE3(futimesat, int, dfd, const char __user *, filename,
-               struct timeval __user *, utimes)
+               struct __kernel_old_timeval __user *, utimes)
 {
        return do_futimesat(dfd, filename, utimes);
 }
 
 SYSCALL_DEFINE2(utimes, char __user *, filename,
-               struct timeval __user *, utimes)
+               struct __kernel_old_timeval __user *, utimes)
 {
        return do_futimesat(AT_FDCWD, filename, utimes);
 }
index 2f27bc9d5ef06949177ee6ac6552a1ac56ed08c9..e665920fa359eeba82f34f317ff174264635b37d 100644 (file)
@@ -51,7 +51,7 @@ struct statx;
 struct __sysctl_args;
 struct sysinfo;
 struct timespec;
-struct timeval;
+struct __kernel_old_timeval;
 struct __kernel_timex;
 struct timezone;
 struct tms;
@@ -732,7 +732,7 @@ asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
 asmlinkage long sys_getcpu(unsigned __user *cpu, unsigned __user *node, struct getcpu_cache __user *cache);
 
 /* kernel/time.c */
-asmlinkage long sys_gettimeofday(struct timeval __user *tv,
+asmlinkage long sys_gettimeofday(struct __kernel_old_timeval __user *tv,
                                struct timezone __user *tz);
 asmlinkage long sys_settimeofday(struct timeval __user *tv,
                                struct timezone __user *tz);
@@ -1082,9 +1082,9 @@ asmlinkage long sys_time32(old_time32_t __user *tloc);
 asmlinkage long sys_utime(char __user *filename,
                                struct utimbuf __user *times);
 asmlinkage long sys_utimes(char __user *filename,
-                               struct timeval __user *utimes);
+                               struct __kernel_old_timeval __user *utimes);
 asmlinkage long sys_futimesat(int dfd, const char __user *filename,
-                             struct timeval __user *utimes);
+                             struct __kernel_old_timeval __user *utimes);
 #endif
 asmlinkage long sys_futimesat_time32(unsigned int dfd,
                                     const char __user *filename,
@@ -1098,7 +1098,7 @@ asmlinkage long sys_getdents(unsigned int fd,
                                struct linux_dirent __user *dirent,
                                unsigned int count);
 asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp,
-                       fd_set __user *exp, struct timeval __user *tvp);
+                       fd_set __user *exp, struct __kernel_old_timeval __user *tvp);
 asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds,
                                int timeout);
 asmlinkage long sys_epoll_wait(int epfd, struct epoll_event __user *events,
index 44bee462ff5791ab2408da2b8b5a6d3b4065b6ea..7cdc64dc237312a109aeb0b49f0e62524c183ce7 100644 (file)
@@ -179,7 +179,7 @@ extern void swsusp_close(fmode_t);
 extern int swsusp_unmark(void);
 #endif
 
-struct timeval;
+struct __kernel_old_timeval;
 /* kernel/power/swsusp.c */
 extern void swsusp_show_speed(ktime_t, ktime_t, unsigned int, char *);
 
index 833abae3364f4b8230a123322553a710536c0736..a0e7b9909f2deb0b3673ea2cae1c677c82eefac4 100644 (file)
@@ -137,7 +137,7 @@ SYSCALL_DEFINE1(stime32, old_time32_t __user *, tptr)
 #endif /* __ARCH_WANT_SYS_TIME32 */
 #endif
 
-SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
+SYSCALL_DEFINE2(gettimeofday, struct __kernel_old_timeval __user *, tv,
                struct timezone __user *, tz)
 {
        if (likely(tv != NULL)) {