diff mbox series

[12/23] y2038: syscalls: change remaining timeval to __kernel_old_timeval

Message ID 20191108211323.1806194-3-arnd@arndb.de
State Accepted
Commit 75d319c06e6a76f67549c0ae1007dc3167804f4e
Headers show
Series None | expand

Commit Message

Arnd Bergmann Nov. 8, 2019, 9:12 p.m. UTC
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.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

---
 arch/powerpc/include/asm/asm-prototypes.h |  3 ++-
 arch/powerpc/kernel/syscalls.c            |  4 ++--
 fs/select.c                               | 10 +++++-----
 fs/utimes.c                               |  8 ++++----
 include/linux/syscalls.h                  | 10 +++++-----
 kernel/power/power.h                      |  2 +-
 kernel/time/time.c                        |  2 +-
 7 files changed, 20 insertions(+), 19 deletions(-)

-- 
2.20.0

Comments

Rafael J. Wysocki Nov. 13, 2019, 10:39 p.m. UTC | #1
On Friday, November 8, 2019 10:12:11 PM CET Arnd Bergmann wrote:
> 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.

> 

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>


For the change in power/power.h

Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>


> ---

>  arch/powerpc/include/asm/asm-prototypes.h |  3 ++-

>  arch/powerpc/kernel/syscalls.c            |  4 ++--

>  fs/select.c                               | 10 +++++-----

>  fs/utimes.c                               |  8 ++++----

>  include/linux/syscalls.h                  | 10 +++++-----

>  kernel/power/power.h                      |  2 +-

>  kernel/time/time.c                        |  2 +-

>  7 files changed, 20 insertions(+), 19 deletions(-)

> 

> diff --git a/arch/powerpc/include/asm/asm-prototypes.h b/arch/powerpc/include/asm/asm-prototypes.h

> index 8561498e653c..2c25dc079cb9 100644

> --- a/arch/powerpc/include/asm/asm-prototypes.h

> +++ b/arch/powerpc/include/asm/asm-prototypes.h

> @@ -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

> diff --git a/arch/powerpc/kernel/syscalls.c b/arch/powerpc/kernel/syscalls.c

> index 3bfb3888e897..078608ec2e92 100644

> --- a/arch/powerpc/kernel/syscalls.c

> +++ b/arch/powerpc/kernel/syscalls.c

> @@ -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);

> diff --git a/fs/select.c b/fs/select.c

> index 53a0c149f528..11d0285d46b7 100644

> --- a/fs/select.c

> +++ b/fs/select.c

> @@ -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 @@ int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,

>  }

>  

>  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)

> diff --git a/fs/utimes.c b/fs/utimes.c

> index 1ba3f7883870..c952b6b3d8a0 100644

> --- a/fs/utimes.c

> +++ b/fs/utimes.c

> @@ -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);

>  }

> diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h

> index 2f27bc9d5ef0..e665920fa359 100644

> --- a/include/linux/syscalls.h

> +++ b/include/linux/syscalls.h

> @@ -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,

> diff --git a/kernel/power/power.h b/kernel/power/power.h

> index 44bee462ff57..7cdc64dc2373 100644

> --- a/kernel/power/power.h

> +++ b/kernel/power/power.h

> @@ -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 *);

>  

> diff --git a/kernel/time/time.c b/kernel/time/time.c

> index 7eba7c9a7e3e..bc114f0be8f1 100644

> --- a/kernel/time/time.c

> +++ b/kernel/time/time.c

> @@ -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)) {

>
diff mbox series

Patch

diff --git a/arch/powerpc/include/asm/asm-prototypes.h b/arch/powerpc/include/asm/asm-prototypes.h
index 8561498e653c..2c25dc079cb9 100644
--- a/arch/powerpc/include/asm/asm-prototypes.h
+++ b/arch/powerpc/include/asm/asm-prototypes.h
@@ -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
diff --git a/arch/powerpc/kernel/syscalls.c b/arch/powerpc/kernel/syscalls.c
index 3bfb3888e897..078608ec2e92 100644
--- a/arch/powerpc/kernel/syscalls.c
+++ b/arch/powerpc/kernel/syscalls.c
@@ -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);
diff --git a/fs/select.c b/fs/select.c
index 53a0c149f528..11d0285d46b7 100644
--- a/fs/select.c
+++ b/fs/select.c
@@ -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 @@  int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
 }
 
 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)
diff --git a/fs/utimes.c b/fs/utimes.c
index 1ba3f7883870..c952b6b3d8a0 100644
--- a/fs/utimes.c
+++ b/fs/utimes.c
@@ -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);
 }
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 2f27bc9d5ef0..e665920fa359 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -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,
diff --git a/kernel/power/power.h b/kernel/power/power.h
index 44bee462ff57..7cdc64dc2373 100644
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -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 *);
 
diff --git a/kernel/time/time.c b/kernel/time/time.c
index 7eba7c9a7e3e..bc114f0be8f1 100644
--- a/kernel/time/time.c
+++ b/kernel/time/time.c
@@ -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)) {