Commit 9afc5eee authored by Arnd Bergmann's avatar Arnd Bergmann

y2038: globally rename compat_time to old_time32

Christoph Hellwig suggested a slightly different path for handling
backwards compatibility with the 32-bit time_t based system calls:

Rather than simply reusing the compat_sys_* entry points on 32-bit
architectures unchanged, we get rid of those entry points and the
compat_time types by renaming them to something that makes more sense
on 32-bit architectures (which don't have a compat mode otherwise),
and then share the entry points under the new name with the 64-bit
architectures that use them for implementing the compatibility.

The following types and interfaces are renamed here, and moved
from linux/compat_time.h to linux/time32.h:

old				new
---				---
compat_time_t			old_time32_t
struct compat_timeval		struct old_timeval32
struct compat_timespec		struct old_timespec32
struct compat_itimerspec	struct old_itimerspec32
ns_to_compat_timeval()		ns_to_old_timeval32()
get_compat_itimerspec64()	get_old_itimerspec32()
put_compat_itimerspec64()	put_old_itimerspec32()
compat_get_timespec64()		get_old_timespec32()
compat_put_timespec64()		put_old_timespec32()

As we already have aliases in place, this patch addresses only the
instances that are relevant to the system call interface in particular,
not those that occur in device drivers and other modules. Those
will get handled separately, while providing the 64-bit version
of the respective interfaces.

I'm not renaming the timex, rusage and itimerval structures, as we are
still debating what the new interface will look like, and whether we
will need a replacement at all.

This also doesn't change the names of the syscall entry points, which can
be done more easily when we actually switch over the 32-bit architectures
to use them, at that point we need to change COMPAT_SYSCALL_DEFINEx to
SYSCALL_DEFINEx with a new name, e.g. with a _time32 suffix.
Suggested-by: default avatarChristoph Hellwig <hch@infradead.org>
Link: https://lore.kernel.org/lkml/20180705222110.GA5698@infradead.org/Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent 33e26418
...@@ -86,11 +86,11 @@ struct compat_stat { ...@@ -86,11 +86,11 @@ struct compat_stat {
compat_off_t st_size; compat_off_t st_size;
compat_off_t st_blksize; compat_off_t st_blksize;
compat_off_t st_blocks; compat_off_t st_blocks;
compat_time_t st_atime; old_time32_t st_atime;
compat_ulong_t st_atime_nsec; compat_ulong_t st_atime_nsec;
compat_time_t st_mtime; old_time32_t st_mtime;
compat_ulong_t st_mtime_nsec; compat_ulong_t st_mtime_nsec;
compat_time_t st_ctime; old_time32_t st_ctime;
compat_ulong_t st_ctime_nsec; compat_ulong_t st_ctime_nsec;
compat_ulong_t __unused4[2]; compat_ulong_t __unused4[2];
}; };
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
#include <linux/compat_time.h> #include <linux/time.h>
#include <asm/compat.h> #include <asm/compat.h>
/* /*
......
...@@ -59,11 +59,11 @@ struct compat_stat { ...@@ -59,11 +59,11 @@ struct compat_stat {
s32 st_pad2[2]; s32 st_pad2[2];
compat_off_t st_size; compat_off_t st_size;
s32 st_pad3; s32 st_pad3;
compat_time_t st_atime; old_time32_t st_atime;
s32 st_atime_nsec; s32 st_atime_nsec;
compat_time_t st_mtime; old_time32_t st_mtime;
s32 st_mtime_nsec; s32 st_mtime_nsec;
compat_time_t st_ctime; old_time32_t st_ctime;
s32 st_ctime_nsec; s32 st_ctime_nsec;
s32 st_blksize; s32 st_blksize;
s32 st_blocks; s32 st_blocks;
......
...@@ -54,10 +54,10 @@ struct elf_prstatus32 ...@@ -54,10 +54,10 @@ struct elf_prstatus32
pid_t pr_ppid; pid_t pr_ppid;
pid_t pr_pgrp; pid_t pr_pgrp;
pid_t pr_sid; pid_t pr_sid;
struct compat_timeval pr_utime; /* User time */ struct old_timeval32 pr_utime; /* User time */
struct compat_timeval pr_stime; /* System time */ struct old_timeval32 pr_stime; /* System time */
struct compat_timeval pr_cutime;/* Cumulative user time */ struct old_timeval32 pr_cutime;/* Cumulative user time */
struct compat_timeval pr_cstime;/* Cumulative system time */ struct old_timeval32 pr_cstime;/* Cumulative system time */
elf_gregset_t pr_reg; /* GP registers */ elf_gregset_t pr_reg; /* GP registers */
int pr_fpvalid; /* True if math co-processor being used. */ int pr_fpvalid; /* True if math co-processor being used. */
}; };
...@@ -81,9 +81,9 @@ struct elf_prpsinfo32 ...@@ -81,9 +81,9 @@ struct elf_prpsinfo32
#define elf_caddr_t u32 #define elf_caddr_t u32
#define init_elf_binfmt init_elfn32_binfmt #define init_elf_binfmt init_elfn32_binfmt
#define jiffies_to_timeval jiffies_to_compat_timeval #define jiffies_to_timeval jiffies_to_old_timeval32
static __inline__ void static __inline__ void
jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value) jiffies_to_old_timeval32(unsigned long jiffies, struct old_timeval32 *value)
{ {
/* /*
* Convert jiffies to nanoseconds and separate with * Convert jiffies to nanoseconds and separate with
...@@ -101,6 +101,6 @@ jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value) ...@@ -101,6 +101,6 @@ jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value)
#define TASK_SIZE TASK_SIZE32 #define TASK_SIZE TASK_SIZE32
#undef ns_to_timeval #undef ns_to_timeval
#define ns_to_timeval ns_to_compat_timeval #define ns_to_timeval ns_to_old_timeval32
#include "../../../fs/binfmt_elf.c" #include "../../../fs/binfmt_elf.c"
...@@ -59,10 +59,10 @@ struct elf_prstatus32 ...@@ -59,10 +59,10 @@ struct elf_prstatus32
pid_t pr_ppid; pid_t pr_ppid;
pid_t pr_pgrp; pid_t pr_pgrp;
pid_t pr_sid; pid_t pr_sid;
struct compat_timeval pr_utime; /* User time */ struct old_timeval32 pr_utime; /* User time */
struct compat_timeval pr_stime; /* System time */ struct old_timeval32 pr_stime; /* System time */
struct compat_timeval pr_cutime;/* Cumulative user time */ struct old_timeval32 pr_cutime;/* Cumulative user time */
struct compat_timeval pr_cstime;/* Cumulative system time */ struct old_timeval32 pr_cstime;/* Cumulative system time */
elf_gregset_t pr_reg; /* GP registers */ elf_gregset_t pr_reg; /* GP registers */
int pr_fpvalid; /* True if math co-processor being used. */ int pr_fpvalid; /* True if math co-processor being used. */
}; };
...@@ -86,9 +86,9 @@ struct elf_prpsinfo32 ...@@ -86,9 +86,9 @@ struct elf_prpsinfo32
#define elf_caddr_t u32 #define elf_caddr_t u32
#define init_elf_binfmt init_elf32_binfmt #define init_elf_binfmt init_elf32_binfmt
#define jiffies_to_timeval jiffies_to_compat_timeval #define jiffies_to_timeval jiffies_to_old_timeval32
static inline void static inline void
jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value) jiffies_to_old_timeval32(unsigned long jiffies, struct old_timeval32 *value)
{ {
/* /*
* Convert jiffies to nanoseconds and separate with * Convert jiffies to nanoseconds and separate with
...@@ -104,6 +104,6 @@ jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value) ...@@ -104,6 +104,6 @@ jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value)
#define TASK_SIZE TASK_SIZE32 #define TASK_SIZE TASK_SIZE32
#undef ns_to_timeval #undef ns_to_timeval
#define ns_to_timeval ns_to_compat_timeval #define ns_to_timeval ns_to_old_timeval32
#include "../../../fs/binfmt_elf.c" #include "../../../fs/binfmt_elf.c"
...@@ -48,11 +48,11 @@ struct compat_stat { ...@@ -48,11 +48,11 @@ struct compat_stat {
u16 st_reserved2; /* old st_gid */ u16 st_reserved2; /* old st_gid */
compat_dev_t st_rdev; compat_dev_t st_rdev;
compat_off_t st_size; compat_off_t st_size;
compat_time_t st_atime; old_time32_t st_atime;
u32 st_atime_nsec; u32 st_atime_nsec;
compat_time_t st_mtime; old_time32_t st_mtime;
u32 st_mtime_nsec; u32 st_mtime_nsec;
compat_time_t st_ctime; old_time32_t st_ctime;
u32 st_ctime_nsec; u32 st_ctime_nsec;
s32 st_blksize; s32 st_blksize;
s32 st_blocks; s32 st_blocks;
......
...@@ -55,11 +55,11 @@ struct compat_stat { ...@@ -55,11 +55,11 @@ struct compat_stat {
compat_off_t st_size; compat_off_t st_size;
compat_off_t st_blksize; compat_off_t st_blksize;
compat_off_t st_blocks; compat_off_t st_blocks;
compat_time_t st_atime; old_time32_t st_atime;
u32 st_atime_nsec; u32 st_atime_nsec;
compat_time_t st_mtime; old_time32_t st_mtime;
u32 st_mtime_nsec; u32 st_mtime_nsec;
compat_time_t st_ctime; old_time32_t st_ctime;
u32 st_ctime_nsec; u32 st_ctime_nsec;
u32 __unused4[2]; u32 __unused4[2];
}; };
......
...@@ -387,12 +387,12 @@ int main(void) ...@@ -387,12 +387,12 @@ int main(void)
OFFSET(CFG_SYSCALL_MAP64, vdso_data, syscall_map_64); OFFSET(CFG_SYSCALL_MAP64, vdso_data, syscall_map_64);
OFFSET(TVAL64_TV_SEC, timeval, tv_sec); OFFSET(TVAL64_TV_SEC, timeval, tv_sec);
OFFSET(TVAL64_TV_USEC, timeval, tv_usec); OFFSET(TVAL64_TV_USEC, timeval, tv_usec);
OFFSET(TVAL32_TV_SEC, compat_timeval, tv_sec); OFFSET(TVAL32_TV_SEC, old_timeval32, tv_sec);
OFFSET(TVAL32_TV_USEC, compat_timeval, tv_usec); OFFSET(TVAL32_TV_USEC, old_timeval32, tv_usec);
OFFSET(TSPC64_TV_SEC, timespec, tv_sec); OFFSET(TSPC64_TV_SEC, timespec, tv_sec);
OFFSET(TSPC64_TV_NSEC, timespec, tv_nsec); OFFSET(TSPC64_TV_NSEC, timespec, tv_nsec);
OFFSET(TSPC32_TV_SEC, compat_timespec, tv_sec); OFFSET(TSPC32_TV_SEC, old_timespec32, tv_sec);
OFFSET(TSPC32_TV_NSEC, compat_timespec, tv_nsec); OFFSET(TSPC32_TV_NSEC, old_timespec32, tv_nsec);
#else #else
OFFSET(TVAL32_TV_SEC, timeval, tv_sec); OFFSET(TVAL32_TV_SEC, timeval, tv_sec);
OFFSET(TVAL32_TV_USEC, timeval, tv_usec); OFFSET(TVAL32_TV_USEC, timeval, tv_usec);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* 2 of the License, or (at your option) any later version. * 2 of the License, or (at your option) any later version.
**/ **/
#include <linux/compat_time.h> #include <linux/time.h>
#include <linux/oprofile.h> #include <linux/oprofile.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <asm/processor.h> #include <asm/processor.h>
......
...@@ -47,11 +47,11 @@ struct compat_stat { ...@@ -47,11 +47,11 @@ struct compat_stat {
__compat_gid_t st_gid; __compat_gid_t st_gid;
compat_dev_t st_rdev; compat_dev_t st_rdev;
compat_off_t st_size; compat_off_t st_size;
compat_time_t st_atime; old_time32_t st_atime;
compat_ulong_t st_atime_nsec; compat_ulong_t st_atime_nsec;
compat_time_t st_mtime; old_time32_t st_mtime;
compat_ulong_t st_mtime_nsec; compat_ulong_t st_mtime_nsec;
compat_time_t st_ctime; old_time32_t st_ctime;
compat_ulong_t st_ctime_nsec; compat_ulong_t st_ctime_nsec;
compat_off_t st_blksize; compat_off_t st_blksize;
compat_off_t st_blocks; compat_off_t st_blocks;
......
...@@ -2135,12 +2135,12 @@ COMPAT_SYSCALL_DEFINE5(io_getevents, compat_aio_context_t, ctx_id, ...@@ -2135,12 +2135,12 @@ COMPAT_SYSCALL_DEFINE5(io_getevents, compat_aio_context_t, ctx_id,
compat_long_t, min_nr, compat_long_t, min_nr,
compat_long_t, nr, compat_long_t, nr,
struct io_event __user *, events, struct io_event __user *, events,
struct compat_timespec __user *, timeout) struct old_timespec32 __user *, timeout)
{ {
struct timespec64 t; struct timespec64 t;
int ret; int ret;
if (timeout && compat_get_timespec64(&t, timeout)) if (timeout && get_old_timespec32(&t, timeout))
return -EFAULT; return -EFAULT;
ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL); ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL);
...@@ -2160,7 +2160,7 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents, ...@@ -2160,7 +2160,7 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents,
compat_long_t, min_nr, compat_long_t, min_nr,
compat_long_t, nr, compat_long_t, nr,
struct io_event __user *, events, struct io_event __user *, events,
struct compat_timespec __user *, timeout, struct old_timespec32 __user *, timeout,
const struct __compat_aio_sigset __user *, usig) const struct __compat_aio_sigset __user *, usig)
{ {
struct __compat_aio_sigset ksig = { NULL, }; struct __compat_aio_sigset ksig = { NULL, };
...@@ -2168,7 +2168,7 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents, ...@@ -2168,7 +2168,7 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents,
struct timespec64 t; struct timespec64 t;
int ret; int ret;
if (timeout && compat_get_timespec64(&t, timeout)) if (timeout && get_old_timespec32(&t, timeout))
return -EFAULT; return -EFAULT;
if (usig && copy_from_user(&ksig, usig, sizeof(ksig))) if (usig && copy_from_user(&ksig, usig, sizeof(ksig)))
......
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
#define elf_prpsinfo compat_elf_prpsinfo #define elf_prpsinfo compat_elf_prpsinfo
#undef ns_to_timeval #undef ns_to_timeval
#define ns_to_timeval ns_to_compat_timeval #define ns_to_timeval ns_to_old_timeval32
/* /*
* To use this file, asm/elf.h must define compat_elf_check_arch. * To use this file, asm/elf.h must define compat_elf_check_arch.
......
...@@ -1120,7 +1120,7 @@ int compat_poll_select_copy_remaining(struct timespec64 *end_time, void __user * ...@@ -1120,7 +1120,7 @@ int compat_poll_select_copy_remaining(struct timespec64 *end_time, void __user *
ts.tv_sec = ts.tv_nsec = 0; ts.tv_sec = ts.tv_nsec = 0;
if (timeval) { if (timeval) {
struct compat_timeval rtv; struct old_timeval32 rtv;
rtv.tv_sec = ts.tv_sec; rtv.tv_sec = ts.tv_sec;
rtv.tv_usec = ts.tv_nsec / NSEC_PER_USEC; rtv.tv_usec = ts.tv_nsec / NSEC_PER_USEC;
...@@ -1128,7 +1128,7 @@ int compat_poll_select_copy_remaining(struct timespec64 *end_time, void __user * ...@@ -1128,7 +1128,7 @@ int compat_poll_select_copy_remaining(struct timespec64 *end_time, void __user *
if (!copy_to_user(p, &rtv, sizeof(rtv))) if (!copy_to_user(p, &rtv, sizeof(rtv)))
return ret; return ret;
} else { } else {
if (!compat_put_timespec64(&ts, p)) if (!put_old_timespec32(&ts, p))
return ret; return ret;
} }
/* /*
...@@ -1257,10 +1257,10 @@ static int compat_core_sys_select(int n, compat_ulong_t __user *inp, ...@@ -1257,10 +1257,10 @@ static int compat_core_sys_select(int n, compat_ulong_t __user *inp,
static int do_compat_select(int n, compat_ulong_t __user *inp, static int do_compat_select(int n, compat_ulong_t __user *inp,
compat_ulong_t __user *outp, compat_ulong_t __user *exp, compat_ulong_t __user *outp, compat_ulong_t __user *exp,
struct compat_timeval __user *tvp) struct old_timeval32 __user *tvp)
{ {
struct timespec64 end_time, *to = NULL; struct timespec64 end_time, *to = NULL;
struct compat_timeval tv; struct old_timeval32 tv;
int ret; int ret;
if (tvp) { if (tvp) {
...@@ -1282,7 +1282,7 @@ static int do_compat_select(int n, compat_ulong_t __user *inp, ...@@ -1282,7 +1282,7 @@ static int do_compat_select(int n, compat_ulong_t __user *inp,
COMPAT_SYSCALL_DEFINE5(select, int, n, compat_ulong_t __user *, inp, COMPAT_SYSCALL_DEFINE5(select, int, n, compat_ulong_t __user *, inp,
compat_ulong_t __user *, outp, compat_ulong_t __user *, exp, compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
struct compat_timeval __user *, tvp) struct old_timeval32 __user *, tvp)
{ {
return do_compat_select(n, inp, outp, exp, tvp); return do_compat_select(n, inp, outp, exp, tvp);
} }
...@@ -1307,7 +1307,7 @@ COMPAT_SYSCALL_DEFINE1(old_select, struct compat_sel_arg_struct __user *, arg) ...@@ -1307,7 +1307,7 @@ COMPAT_SYSCALL_DEFINE1(old_select, struct compat_sel_arg_struct __user *, arg)
static long do_compat_pselect(int n, compat_ulong_t __user *inp, static long do_compat_pselect(int n, compat_ulong_t __user *inp,
compat_ulong_t __user *outp, compat_ulong_t __user *exp, compat_ulong_t __user *outp, compat_ulong_t __user *exp,
struct compat_timespec __user *tsp, compat_sigset_t __user *sigmask, struct old_timespec32 __user *tsp, compat_sigset_t __user *sigmask,
compat_size_t sigsetsize) compat_size_t sigsetsize)
{ {
sigset_t ksigmask, sigsaved; sigset_t ksigmask, sigsaved;
...@@ -1315,7 +1315,7 @@ static long do_compat_pselect(int n, compat_ulong_t __user *inp, ...@@ -1315,7 +1315,7 @@ static long do_compat_pselect(int n, compat_ulong_t __user *inp,
int ret; int ret;
if (tsp) { if (tsp) {
if (compat_get_timespec64(&ts, tsp)) if (get_old_timespec32(&ts, tsp))
return -EFAULT; return -EFAULT;
to = &end_time; to = &end_time;
...@@ -1355,7 +1355,7 @@ static long do_compat_pselect(int n, compat_ulong_t __user *inp, ...@@ -1355,7 +1355,7 @@ static long do_compat_pselect(int n, compat_ulong_t __user *inp,
COMPAT_SYSCALL_DEFINE6(pselect6, int, n, compat_ulong_t __user *, inp, COMPAT_SYSCALL_DEFINE6(pselect6, int, n, compat_ulong_t __user *, inp,
compat_ulong_t __user *, outp, compat_ulong_t __user *, exp, compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
struct compat_timespec __user *, tsp, void __user *, sig) struct old_timespec32 __user *, tsp, void __user *, sig)
{ {
compat_size_t sigsetsize = 0; compat_size_t sigsetsize = 0;
compat_uptr_t up = 0; compat_uptr_t up = 0;
...@@ -1373,7 +1373,7 @@ COMPAT_SYSCALL_DEFINE6(pselect6, int, n, compat_ulong_t __user *, inp, ...@@ -1373,7 +1373,7 @@ COMPAT_SYSCALL_DEFINE6(pselect6, int, n, compat_ulong_t __user *, inp,
} }
COMPAT_SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, COMPAT_SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds,
unsigned int, nfds, struct compat_timespec __user *, tsp, unsigned int, nfds, struct old_timespec32 __user *, tsp,
const compat_sigset_t __user *, sigmask, compat_size_t, sigsetsize) const compat_sigset_t __user *, sigmask, compat_size_t, sigsetsize)
{ {
sigset_t ksigmask, sigsaved; sigset_t ksigmask, sigsaved;
...@@ -1381,7 +1381,7 @@ COMPAT_SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, ...@@ -1381,7 +1381,7 @@ COMPAT_SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds,
int ret; int ret;
if (tsp) { if (tsp) {
if (compat_get_timespec64(&ts, tsp)) if (get_old_timespec32(&ts, tsp))
return -EFAULT; return -EFAULT;
to = &end_time; to = &end_time;
......
...@@ -561,29 +561,29 @@ SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct __kernel_itimerspec __user *, ...@@ -561,29 +561,29 @@ SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct __kernel_itimerspec __user *,
#ifdef CONFIG_COMPAT_32BIT_TIME #ifdef CONFIG_COMPAT_32BIT_TIME
COMPAT_SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags, COMPAT_SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
const struct compat_itimerspec __user *, utmr, const struct old_itimerspec32 __user *, utmr,
struct compat_itimerspec __user *, otmr) struct old_itimerspec32 __user *, otmr)
{ {
struct itimerspec64 new, old; struct itimerspec64 new, old;
int ret; int ret;
if (get_compat_itimerspec64(&new, utmr)) if (get_old_itimerspec32(&new, utmr))
return -EFAULT; return -EFAULT;
ret = do_timerfd_settime(ufd, flags, &new, &old); ret = do_timerfd_settime(ufd, flags, &new, &old);
if (ret) if (ret)
return ret; return ret;
if (otmr && put_compat_itimerspec64(&old, otmr)) if (otmr && put_old_itimerspec32(&old, otmr))
return -EFAULT; return -EFAULT;
return ret; return ret;
} }
COMPAT_SYSCALL_DEFINE2(timerfd_gettime, int, ufd, COMPAT_SYSCALL_DEFINE2(timerfd_gettime, int, ufd,
struct compat_itimerspec __user *, otmr) struct old_itimerspec32 __user *, otmr)
{ {
struct itimerspec64 kotmr; struct itimerspec64 kotmr;
int ret = do_timerfd_gettime(ufd, &kotmr); int ret = do_timerfd_gettime(ufd, &kotmr);
if (ret) if (ret)
return ret; return ret;
return put_compat_itimerspec64(&kotmr, otmr) ? -EFAULT : 0; return put_old_itimerspec32(&kotmr, otmr) ? -EFAULT : 0;
} }
#endif #endif
...@@ -245,13 +245,13 @@ COMPAT_SYSCALL_DEFINE2(utime, const char __user *, filename, ...@@ -245,13 +245,13 @@ COMPAT_SYSCALL_DEFINE2(utime, const char __user *, filename,
return do_utimes(AT_FDCWD, filename, t ? tv : NULL, 0); return do_utimes(AT_FDCWD, filename, t ? tv : NULL, 0);
} }
COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filename, struct compat_timespec __user *, t, int, flags) COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filename, struct old_timespec32 __user *, t, int, flags)
{ {
struct timespec64 tv[2]; struct timespec64 tv[2];
if (t) { if (t) {
if (compat_get_timespec64(&tv[0], &t[0]) || if (get_old_timespec32(&tv[0], &t[0]) ||
compat_get_timespec64(&tv[1], &t[1])) get_old_timespec32(&tv[1], &t[1]))
return -EFAULT; return -EFAULT;
if (tv[0].tv_nsec == UTIME_OMIT && tv[1].tv_nsec == UTIME_OMIT) if (tv[0].tv_nsec == UTIME_OMIT && tv[1].tv_nsec == UTIME_OMIT)
...@@ -261,7 +261,7 @@ COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filena ...@@ -261,7 +261,7 @@ COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filena
} }
static long do_compat_futimesat(unsigned int dfd, const char __user *filename, static long do_compat_futimesat(unsigned int dfd, const char __user *filename,
struct compat_timeval __user *t) struct old_timeval32 __user *t)
{ {
struct timespec64 tv[2]; struct timespec64 tv[2];
...@@ -282,12 +282,12 @@ static long do_compat_futimesat(unsigned int dfd, const char __user *filename, ...@@ -282,12 +282,12 @@ static long do_compat_futimesat(unsigned int dfd, const char __user *filename,
COMPAT_SYSCALL_DEFINE3(futimesat, unsigned int, dfd, COMPAT_SYSCALL_DEFINE3(futimesat, unsigned int, dfd,
const char __user *, filename, const char __user *, filename,
struct compat_timeval __user *, t) struct old_timeval32 __user *, t)
{ {
return do_compat_futimesat(dfd, filename, t); return do_compat_futimesat(dfd, filename, t);
} }
COMPAT_SYSCALL_DEFINE2(utimes, const char __user *, filename, struct compat_timeval __user *, t) COMPAT_SYSCALL_DEFINE2(utimes, const char __user *, filename, struct old_timeval32 __user *, t)
{ {
return do_compat_futimesat(AT_FDCWD, filename, t); return do_compat_futimesat(AT_FDCWD, filename, t);
} }
......
This diff is collapsed.
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_COMPAT_TIME_H
#define _LINUX_COMPAT_TIME_H
#include <linux/types.h>
#include <linux/time64.h>
typedef s32 compat_time_t;
struct compat_timespec {
compat_time_t tv_sec;
s32 tv_nsec;
};
struct compat_timeval {
compat_time_t tv_sec;
s32 tv_usec;
};
struct compat_itimerspec {
struct compat_timespec it_interval;
struct compat_timespec it_value;
};
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,
struct compat_itimerspec __user *uits);
#endif /* _LINUX_COMPAT_TIME_H */
...@@ -27,10 +27,10 @@ struct compat_elf_prstatus ...@@ -27,10 +27,10 @@ struct compat_elf_prstatus
compat_pid_t pr_ppid; compat_pid_t pr_ppid;
compat_pid_t pr_pgrp; compat_pid_t pr_pgrp;
compat_pid_t pr_sid; compat_pid_t pr_sid;
struct compat_timeval pr_utime; struct old_timeval32 pr_utime;
struct compat_timeval pr_stime; struct old_timeval32 pr_stime;
struct compat_timeval pr_cutime; struct old_timeval32 pr_cutime;
struct compat_timeval pr_cstime; struct old_timeval32 pr_cstime;
compat_elf_gregset_t pr_reg; compat_elf_gregset_t pr_reg;
#ifdef CONFIG_BINFMT_ELF_FDPIC #ifdef CONFIG_BINFMT_ELF_FDPIC
compat_ulong_t pr_exec_fdpic_loadmap; compat_ulong_t pr_exec_fdpic_loadmap;
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
#include <linux/time64.h> #include <linux/time64.h>
struct timespec; struct timespec;
struct compat_timespec; struct old_timespec32;
struct pollfd; struct pollfd;
enum timespec_type { enum timespec_type {
...@@ -40,7 +40,7 @@ struct restart_block { ...@@ -40,7 +40,7 @@ struct restart_block {
enum timespec_type type; enum timespec_type type;
union { union {
struct __kernel_timespec __user *rmtp; struct __kernel_timespec __user *rmtp;
struct compat_timespec __user *compat_rmtp; struct old_timespec32 __user *compat_rmtp;
}; };
u64 expires; u64 expires;
} nanosleep; } nanosleep;
......
...@@ -60,7 +60,7 @@ struct tms; ...@@ -60,7 +60,7 @@ struct tms;
struct utimbuf; struct utimbuf;
struct mq_attr; struct mq_attr;
struct compat_stat; struct compat_stat;
struct compat_timeval; struct old_timeval32;
struct robust_list_head; struct robust_list_head;
struct getcpu_cache; struct getcpu_cache;
struct old_linux_dirent; struct old_linux_dirent;
......
...@@ -13,6 +13,31 @@ ...@@ -13,6 +13,31 @@
#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1) #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
typedef s32 old_time32_t;
struct old_timespec32 {
old_time32_t tv_sec;
s32 tv_nsec;
};
struct old_timeval32 {
old_time32_t tv_sec;
s32 tv_usec;
};
struct old_itimerspec32 {
struct old_timespec32 it_interval;
struct old_timespec32 it_value;
};
extern int get_old_timespec32(struct timespec64 *, const void __user *);
extern int put_old_timespec32(const struct timespec64 *, void __user *);
extern int get_old_itimerspec32(struct itimerspec64 *its,
const struct old_itimerspec32 __user *uits);
extern int put_old_itimerspec32(const struct itimerspec64 *its,
struct old_itimerspec32 __user *uits);
#if __BITS_PER_LONG == 64 #if __BITS_PER_LONG == 64
/* timespec64 is defined as timespec here */ /* timespec64 is defined as timespec here */
...@@ -183,18 +208,17 @@ extern struct timeval ns_to_timeval(const s64 nsec); ...@@ -183,18 +208,17 @@ extern struct timeval ns_to_timeval(const s64 nsec);
extern struct __kernel_old_timeval ns_to_kernel_old_timeval(s64 nsec); extern struct __kernel_old_timeval ns_to_kernel_old_timeval(s64 nsec);
/* /*
* New aliases for compat time functions. These will be used to replace * Old names for the 32-bit time_t interfaces, these will be removed
* the compat code so it can be shared between 32-bit and 64-bit builds * when everything uses the new names.
* both of which provide compatibility with old 32-bit tasks.
*/ */
#define old_time32_t compat_time_t #define compat_time_t old_time32_t
#define old_timeval32 compat_timeval #define compat_timeval old_timeval32
#define old_timespec32 compat_timespec #define compat_timespec old_timespec32
#define old_itimerspec32 compat_itimerspec #define compat_itimerspec old_itimerspec32
#define ns_to_old_timeval32 ns_to_compat_timeval #define ns_to_compat_timeval ns_to_old_timeval32
#define get_old_itimerspec32 get_compat_itimerspec64 #define get_compat_itimerspec64 get_old_itimerspec32
#define put_old_itimerspec32 put_compat_itimerspec64 #define put_compat_itimerspec64 put_old_itimerspec32
#define get_old_timespec32 compat_get_timespec64 #define compat_get_timespec64 get_old_timespec32
#define put_old_timespec32 compat_put_timespec64 #define compat_put_timespec64 put_old_timespec32
#endif #endif
...@@ -1461,10 +1461,10 @@ COMPAT_SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes, ...@@ -1461,10 +1461,10 @@ COMPAT_SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
#endif #endif
#ifdef CONFIG_COMPAT_32BIT_TIME #ifdef CONFIG_COMPAT_32BIT_TIME
static int compat_prepare_timeout(const struct compat_timespec __user *p, static int compat_prepare_timeout(const struct old_timespec32 __user *p,
struct timespec64 *ts) struct timespec64 *ts)
{ {
if (compat_get_timespec64(ts, p)) if (get_old_timespec32(ts, p))
return -EFAULT; return -EFAULT;
if (!timespec64_valid(ts)) if (!timespec64_valid(ts))
return -EINVAL; return -EINVAL;
...@@ -1474,7 +1474,7 @@ static int compat_prepare_timeout(const struct compat_timespec __user *p, ...@@ -1474,7 +1474,7 @@ static int compat_prepare_timeout(const struct compat_timespec __user *p,
COMPAT_SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, COMPAT_SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes,
const char __user *, u_msg_ptr, const char __user *, u_msg_ptr,
compat_size_t, msg_len, unsigned int, msg_prio, compat_size_t, msg_len, unsigned int, msg_prio,
const struct compat_timespec __user *, u_abs_timeout) const struct old_timespec32 __user *, u_abs_timeout)
{ {
struct timespec64 ts, *p = NULL; struct timespec64 ts, *p = NULL;
if (u_abs_timeout) { if (u_abs_timeout) {
...@@ -1489,7 +1489,7 @@ COMPAT_SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, ...@@ -1489,7 +1489,7 @@ COMPAT_SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes,
COMPAT_SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, COMPAT_SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes,
char __user *, u_msg_ptr, char __user *, u_msg_ptr,
compat_size_t, msg_len, unsigned int __user *, u_msg_prio, compat_size_t, msg_len, unsigned int __user *, u_msg_prio,
const struct compat_timespec __user *, u_abs_timeout) const struct old_timespec32 __user *, u_abs_timeout)
{ {
struct timespec64 ts, *p = NULL; struct timespec64 ts, *p = NULL;
if (u_abs_timeout) { if (u_abs_timeout) {
......
...@@ -622,9 +622,9 @@ struct compat_msqid_ds { ...@@ -622,9 +622,9 @@ struct compat_msqid_ds {
struct compat_ipc_perm msg_perm; struct compat_ipc_perm msg_perm;
compat_uptr_t msg_first; compat_uptr_t msg_first;
compat_uptr_t msg_last; compat_uptr_t msg_last;
compat_time_t msg_stime; old_time32_t msg_stime;
compat_time_t msg_rtime; old_time32_t msg_rtime;
compat_time_t msg_ctime; old_time32_t msg_ctime;
compat_ulong_t msg_lcbytes; compat_ulong_t msg_lcbytes;
compat_ulong_t msg_lqbytes; compat_ulong_t msg_lqbytes;
unsigned short msg_cbytes; unsigned short msg_cbytes;
......
...@@ -1698,8 +1698,8 @@ SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg) ...@@ -1698,8 +1698,8 @@ SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)
struct compat_semid_ds { struct compat_semid_ds {
struct compat_ipc_perm sem_perm; struct compat_ipc_perm sem_perm;
compat_time_t sem_otime; old_time32_t sem_otime;
compat_time_t sem_ctime; old_time32_t sem_ctime;
compat_uptr_t sem_base; compat_uptr_t sem_base;
compat_uptr_t sem_pending; compat_uptr_t sem_pending;
compat_uptr_t sem_pending_last; compat_uptr_t sem_pending_last;
...@@ -2214,11 +2214,11 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops, ...@@ -2214,11 +2214,11 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
#ifdef CONFIG_COMPAT_32BIT_TIME #ifdef CONFIG_COMPAT_32BIT_TIME
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems, long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
unsigned int nsops, unsigned int nsops,
const struct compat_timespec __user *timeout) const struct old_timespec32 __user *timeout)
{ {
if (timeout) { if (timeout) {
struct timespec64 ts; struct timespec64 ts;
if (compat_get_timespec64(&ts, timeout)) if (get_old_timespec32(&ts, timeout))
return -EFAULT; return -EFAULT;
return do_semtimedop(semid, tsems, nsops, &ts); return do_semtimedop(semid, tsems, nsops, &ts);
} }
...@@ -2227,7 +2227,7 @@ long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems, ...@@ -2227,7 +2227,7 @@ long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems, COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems,
unsigned int, nsops, unsigned int, nsops,
const struct compat_timespec __user *, timeout) const struct old_timespec32 __user *, timeout)
{ {
return compat_ksys_semtimedop(semid, tsems, nsops, timeout); return compat_ksys_semtimedop(semid, tsems, nsops, timeout);
} }
......
...@@ -1201,9 +1201,9 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf) ...@@ -1201,9 +1201,9 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
struct compat_shmid_ds { struct compat_shmid_ds {
struct compat_ipc_perm shm_perm; struct compat_ipc_perm shm_perm;
int shm_segsz; int shm_segsz;
compat_time_t shm_atime; old_time32_t shm_atime;
compat_time_t shm_dtime; old_time32_t shm_dtime;
compat_time_t shm_ctime; old_time32_t shm_ctime;
compat_ipc_pid_t shm_cpid; compat_ipc_pid_t shm_cpid;
compat_ipc_pid_t shm_lpid; compat_ipc_pid_t shm_lpid;
unsigned short shm_nattch; unsigned short shm_nattch;
......
...@@ -35,7 +35,7 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second, ...@@ -35,7 +35,7 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
(const struct __kernel_timespec __user *)fifth); (const struct __kernel_timespec __user *)fifth);
else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME)) else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
return compat_ksys_semtimedop(first, ptr, second, return compat_ksys_semtimedop(first, ptr, second,
(const struct compat_timespec __user *)fifth); (const struct old_timespec32 __user *)fifth);
else else
return -ENOSYS; return -ENOSYS;
......
...@@ -266,7 +266,7 @@ long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf); ...@@ -266,7 +266,7 @@ long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
/* for CONFIG_ARCH_WANT_OLD_COMPAT_IPC */ /* for CONFIG_ARCH_WANT_OLD_COMPAT_IPC */
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems, long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
unsigned int nsops, unsigned int nsops,
const struct compat_timespec __user *timeout); const struct old_timespec32 __user *timeout);
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
long compat_ksys_semctl(int semid, int semnum, int cmd, int arg); long compat_ksys_semctl(int semid, int semnum, int cmd, int arg);
long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr); long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr);
......
...@@ -93,28 +93,28 @@ int compat_put_timex(struct compat_timex __user *utp, const struct timex *txc) ...@@ -93,28 +93,28 @@ int compat_put_timex(struct compat_timex __user *utp, const struct timex *txc)
return 0; return 0;
} }
static int __compat_get_timeval(struct timeval *tv, const struct compat_timeval __user *ctv) static int __compat_get_timeval(struct timeval *tv, const struct old_timeval32 __user *ctv)
{ {
return (!access_ok(VERIFY_READ, ctv, sizeof(*ctv)) || return (!access_ok(VERIFY_READ, ctv, sizeof(*ctv)) ||
__get_user(tv->tv_sec, &ctv->tv_sec) || __get_user(tv->tv_sec, &ctv->tv_sec) ||
__get_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0; __get_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0;
} }
static int __compat_put_timeval(const struct timeval *tv, struct compat_timeval __user *ctv) static int __compat_put_timeval(const struct timeval *tv, struct old_timeval32 __user *ctv)
{ {
return (!access_ok(VERIFY_WRITE, ctv, sizeof(*ctv)) || return (!access_ok(VERIFY_WRITE, ctv, sizeof(*ctv)) ||
__put_user(tv->tv_sec, &ctv->tv_sec) || __put_user(tv->tv_sec, &ctv->tv_sec) ||
__put_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0; __put_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0;
} }
static int __compat_get_timespec(struct timespec *ts, const struct compat_timespec __user *cts) static int __compat_get_timespec(struct timespec *ts, const struct old_timespec32 __user *cts)
{ {
return (!access_ok(VERIFY_READ, cts, sizeof(*cts)) || return (!access_ok(VERIFY_READ, cts, sizeof(*cts)) ||
__get_user(ts->tv_sec, &cts->tv_sec) || __get_user(ts->tv_sec, &cts->tv_sec) ||
__get_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0; __get_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0;
} }
static int __compat_put_timespec(const struct timespec *ts, struct compat_timespec __user *cts) static int __compat_put_timespec(const struct timespec *ts, struct old_timespec32 __user *cts)
{ {
return (!access_ok(VERIFY_WRITE, cts, sizeof(*cts)) || return (!access_ok(VERIFY_WRITE, cts, sizeof(*cts)) ||
__put_user(ts->tv_sec, &cts->tv_sec) || __put_user(ts->tv_sec, &cts->tv_sec) ||
......
...@@ -173,7 +173,7 @@ COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid, ...@@ -173,7 +173,7 @@ COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid,
} }
COMPAT_SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val, COMPAT_SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
struct compat_timespec __user *, utime, u32 __user *, uaddr2, struct old_timespec32 __user *, utime, u32 __user *, uaddr2,
u32, val3) u32, val3)
{ {
struct timespec ts; struct timespec ts;
......
...@@ -5257,13 +5257,13 @@ SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid, ...@@ -5257,13 +5257,13 @@ SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid,
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE2(sched_rr_get_interval, COMPAT_SYSCALL_DEFINE2(sched_rr_get_interval,
compat_pid_t, pid, compat_pid_t, pid,
struct compat_timespec __user *, interval) struct old_timespec32 __user *, interval)
{ {
struct timespec64 t; struct timespec64 t;
int retval = sched_rr_get_interval(pid, &t); int retval = sched_rr_get_interval(pid, &t);
if (retval == 0) if (retval == 0)
retval = compat_put_timespec64(&t, interval); retval = put_old_timespec32(&t, interval);
return retval; return retval;
} }
#endif #endif
......
...@@ -3173,7 +3173,7 @@ SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese, ...@@ -3173,7 +3173,7 @@ SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese,
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese, COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese,
struct compat_siginfo __user *, uinfo, struct compat_siginfo __user *, uinfo,
struct compat_timespec __user *, uts, compat_size_t, sigsetsize) struct old_timespec32 __user *, uts, compat_size_t, sigsetsize)
{ {
sigset_t s; sigset_t s;
struct timespec t; struct timespec t;
......
...@@ -1660,7 +1660,7 @@ int nanosleep_copyout(struct restart_block *restart, struct timespec64 *ts) ...@@ -1660,7 +1660,7 @@ int nanosleep_copyout(struct restart_block *restart, struct timespec64 *ts)
switch(restart->nanosleep.type) { switch(restart->nanosleep.type) {
#ifdef CONFIG_COMPAT_32BIT_TIME #ifdef CONFIG_COMPAT_32BIT_TIME
case TT_COMPAT: case TT_COMPAT:
if (compat_put_timespec64(ts, restart->nanosleep.compat_rmtp)) if (put_old_timespec32(ts, restart->nanosleep.compat_rmtp))
return -EFAULT; return -EFAULT;
break; break;
#endif #endif
...@@ -1780,12 +1780,12 @@ SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp, ...@@ -1780,12 +1780,12 @@ SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp,
#ifdef CONFIG_COMPAT_32BIT_TIME #ifdef CONFIG_COMPAT_32BIT_TIME
COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, COMPAT_SYSCALL_DEFINE2(nanosleep, struct old_timespec32 __user *, rqtp,
struct compat_timespec __user *, rmtp) struct old_timespec32 __user *, rmtp)
{ {
struct timespec64 tu; struct timespec64 tu;
if (compat_get_timespec64(&tu, rqtp)) if (get_old_timespec32(&tu, rqtp))
return -EFAULT; return -EFAULT;
if (!timespec64_valid(&tu)) if (!timespec64_valid(&tu))
......
...@@ -162,20 +162,20 @@ COMPAT_SYS_NI(setitimer); ...@@ -162,20 +162,20 @@ COMPAT_SYS_NI(setitimer);
#ifdef CONFIG_COMPAT_32BIT_TIME #ifdef CONFIG_COMPAT_32BIT_TIME
COMPAT_SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, COMPAT_SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
struct compat_timespec __user *, tp) struct old_timespec32 __user *, tp)
{ {
struct timespec64 new_tp; struct timespec64 new_tp;
if (which_clock != CLOCK_REALTIME) if (which_clock != CLOCK_REALTIME)
return -EINVAL; return -EINVAL;
if (compat_get_timespec64(&new_tp, tp)) if (get_old_timespec32(&new_tp, tp))
return -EFAULT; return -EFAULT;
return do_sys_settimeofday64(&new_tp, NULL); return do_sys_settimeofday64(&new_tp, NULL);
} }
COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock, COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
struct compat_timespec __user *, tp) struct old_timespec32 __user *, tp)
{ {
int ret; int ret;
struct timespec64 kernel_tp; struct timespec64 kernel_tp;
...@@ -184,13 +184,13 @@ COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock, ...@@ -184,13 +184,13 @@ COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
if (ret) if (ret)
return ret; return ret;
if (compat_put_timespec64(&kernel_tp, tp)) if (put_old_timespec32(&kernel_tp, tp))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock, COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
struct compat_timespec __user *, tp) struct old_timespec32 __user *, tp)
{ {
struct timespec64 rtn_tp = { struct timespec64 rtn_tp = {
.tv_sec = 0, .tv_sec = 0,
...@@ -201,7 +201,7 @@ COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock, ...@@ -201,7 +201,7 @@ COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
case CLOCK_REALTIME: case CLOCK_REALTIME:
case CLOCK_MONOTONIC: case CLOCK_MONOTONIC:
case CLOCK_BOOTTIME: case CLOCK_BOOTTIME:
if (compat_put_timespec64(&rtn_tp, tp)) if (put_old_timespec32(&rtn_tp, tp))
return -EFAULT; return -EFAULT;
return 0; return 0;
default: default:
...@@ -210,8 +210,8 @@ COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock, ...@@ -210,8 +210,8 @@ COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
} }
COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags, COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
struct compat_timespec __user *, rqtp, struct old_timespec32 __user *, rqtp,
struct compat_timespec __user *, rmtp) struct old_timespec32 __user *, rmtp)
{ {
struct timespec64 t; struct timespec64 t;
...@@ -224,7 +224,7 @@ COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags, ...@@ -224,7 +224,7 @@ COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
return -EINVAL; return -EINVAL;
} }
if (compat_get_timespec64(&t, rqtp)) if (get_old_timespec32(&t, rqtp))
return -EFAULT; return -EFAULT;
if (!timespec64_valid(&t)) if (!timespec64_valid(&t))
return -EINVAL; return -EINVAL;
......
...@@ -755,13 +755,13 @@ SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id, ...@@ -755,13 +755,13 @@ SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
#ifdef CONFIG_COMPAT_32BIT_TIME #ifdef CONFIG_COMPAT_32BIT_TIME
COMPAT_SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id, COMPAT_SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
struct compat_itimerspec __user *, setting) struct old_itimerspec32 __user *, setting)
{ {
struct itimerspec64 cur_setting; struct itimerspec64 cur_setting;
int ret = do_timer_gettime(timer_id, &cur_setting); int ret = do_timer_gettime(timer_id, &cur_setting);
if (!ret) { if (!ret) {
if (put_compat_itimerspec64(&cur_setting, setting)) if (put_old_itimerspec32(&cur_setting, setting))
ret = -EFAULT; ret = -EFAULT;
} }
return ret; return ret;
...@@ -928,8 +928,8 @@ SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags, ...@@ -928,8 +928,8 @@ SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
#ifdef CONFIG_COMPAT_32BIT_TIME #ifdef CONFIG_COMPAT_32BIT_TIME
COMPAT_SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags, COMPAT_SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
struct compat_itimerspec __user *, new, struct old_itimerspec32 __user *, new,
struct compat_itimerspec __user *, old) struct old_itimerspec32 __user *, old)
{ {
struct itimerspec64 new_spec, old_spec; struct itimerspec64 new_spec, old_spec;
struct itimerspec64 *rtn = old ? &old_spec : NULL; struct itimerspec64 *rtn = old ? &old_spec : NULL;
...@@ -937,12 +937,12 @@ COMPAT_SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags, ...@@ -937,12 +937,12 @@ COMPAT_SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
if (!new) if (!new)
return -EINVAL; return -EINVAL;
if (get_compat_itimerspec64(&new_spec, new)) if (get_old_itimerspec32(&new_spec, new))
return -EFAULT; return -EFAULT;
error = do_timer_settime(timer_id, flags, &new_spec, rtn); error = do_timer_settime(timer_id, flags, &new_spec, rtn);
if (!error && old) { if (!error && old) {
if (put_compat_itimerspec64(&old_spec, old)) if (put_old_itimerspec32(&old_spec, old))
error = -EFAULT; error = -EFAULT;
} }
return error; return error;
...@@ -1115,7 +1115,7 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, ...@@ -1115,7 +1115,7 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,
#ifdef CONFIG_COMPAT_32BIT_TIME #ifdef CONFIG_COMPAT_32BIT_TIME
COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock, COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock,
struct compat_timespec __user *, tp) struct old_timespec32 __user *, tp)
{ {
const struct k_clock *kc = clockid_to_kclock(which_clock); const struct k_clock *kc = clockid_to_kclock(which_clock);
struct timespec64 ts; struct timespec64 ts;
...@@ -1123,14 +1123,14 @@ COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock, ...@@ -1123,14 +1123,14 @@ COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock,
if (!kc || !kc->clock_set) if (!kc || !kc->clock_set)
return -EINVAL; return -EINVAL;
if (compat_get_timespec64(&ts, tp)) if (get_old_timespec32(&ts, tp))
return -EFAULT; return -EFAULT;
return kc->clock_set(which_clock, &ts); return kc->clock_set(which_clock, &ts);
} }
COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock, COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
struct compat_timespec __user *, tp) struct old_timespec32 __user *, tp)
{ {
const struct k_clock *kc = clockid_to_kclock(which_clock); const struct k_clock *kc = clockid_to_kclock(which_clock);
struct timespec64 ts; struct timespec64 ts;
...@@ -1141,7 +1141,7 @@ COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock, ...@@ -1141,7 +1141,7 @@ COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
err = kc->clock_get(which_clock, &ts); err = kc->clock_get(which_clock, &ts);
if (!err && compat_put_timespec64(&ts, tp)) if (!err && put_old_timespec32(&ts, tp))
err = -EFAULT; err = -EFAULT;
return err; return err;
...@@ -1180,7 +1180,7 @@ COMPAT_SYSCALL_DEFINE2(clock_adjtime, clockid_t, which_clock, ...@@ -1180,7 +1180,7 @@ COMPAT_SYSCALL_DEFINE2(clock_adjtime, clockid_t, which_clock,
#ifdef CONFIG_COMPAT_32BIT_TIME #ifdef CONFIG_COMPAT_32BIT_TIME
COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock, COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
struct compat_timespec __user *, tp) struct old_timespec32 __user *, tp)
{ {
const struct k_clock *kc = clockid_to_kclock(which_clock); const struct k_clock *kc = clockid_to_kclock(which_clock);
struct timespec64 ts; struct timespec64 ts;
...@@ -1190,7 +1190,7 @@ COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock, ...@@ -1190,7 +1190,7 @@ COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
return -EINVAL; return -EINVAL;
err = kc->clock_getres(which_clock, &ts); err = kc->clock_getres(which_clock, &ts);
if (!err && tp && compat_put_timespec64(&ts, tp)) if (!err && tp && put_old_timespec32(&ts, tp))
return -EFAULT; return -EFAULT;
return err; return err;
...@@ -1237,8 +1237,8 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags, ...@@ -1237,8 +1237,8 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
#ifdef CONFIG_COMPAT_32BIT_TIME #ifdef CONFIG_COMPAT_32BIT_TIME
COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags, COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
struct compat_timespec __user *, rqtp, struct old_timespec32 __user *, rqtp,
struct compat_timespec __user *, rmtp) struct old_timespec32 __user *, rmtp)
{ {
const struct k_clock *kc = clockid_to_kclock(which_clock); const struct k_clock *kc = clockid_to_kclock(which_clock);
struct timespec64 t; struct timespec64 t;
...@@ -1248,7 +1248,7 @@ COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags, ...@@ -1248,7 +1248,7 @@ COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
if (!kc->nsleep) if (!kc->nsleep)
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (compat_get_timespec64(&t, rqtp)) if (get_old_timespec32(&t, rqtp))
return -EFAULT; return -EFAULT;
if (!timespec64_valid(&t)) if (!timespec64_valid(&t))
......
...@@ -104,12 +104,12 @@ SYSCALL_DEFINE1(stime, time_t __user *, tptr) ...@@ -104,12 +104,12 @@ SYSCALL_DEFINE1(stime, time_t __user *, tptr)
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
#ifdef __ARCH_WANT_COMPAT_SYS_TIME #ifdef __ARCH_WANT_COMPAT_SYS_TIME
/* compat_time_t is a 32 bit "long" and needs to get converted. */ /* old_time32_t is a 32 bit "long" and needs to get converted. */
COMPAT_SYSCALL_DEFINE1(time, compat_time_t __user *, tloc) COMPAT_SYSCALL_DEFINE1(time, old_time32_t __user *, tloc)
{ {
compat_time_t i; old_time32_t i;
i = (compat_time_t)ktime_get_real_seconds(); i = (old_time32_t)ktime_get_real_seconds();
if (tloc) { if (tloc) {
if (put_user(i,tloc)) if (put_user(i,tloc))
...@@ -119,7 +119,7 @@ COMPAT_SYSCALL_DEFINE1(time, compat_time_t __user *, tloc) ...@@ -119,7 +119,7 @@ COMPAT_SYSCALL_DEFINE1(time, compat_time_t __user *, tloc)
return i; return i;
} }
COMPAT_SYSCALL_DEFINE1(stime, compat_time_t __user *, tptr) COMPAT_SYSCALL_DEFINE1(stime, old_time32_t __user *, tptr)
{ {
struct timespec64 tv; struct timespec64 tv;
int err; int err;
...@@ -225,7 +225,7 @@ SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv, ...@@ -225,7 +225,7 @@ SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv, COMPAT_SYSCALL_DEFINE2(gettimeofday, struct old_timeval32 __user *, tv,
struct timezone __user *, tz) struct timezone __user *, tz)
{ {
if (tv) { if (tv) {
...@@ -244,7 +244,7 @@ COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv, ...@@ -244,7 +244,7 @@ COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv,
return 0; return 0;
} }
COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv, COMPAT_SYSCALL_DEFINE2(settimeofday, struct old_timeval32 __user *, tv,
struct timezone __user *, tz) struct timezone __user *, tz)
{ {
struct timespec64 new_ts; struct timespec64 new_ts;
...@@ -863,10 +863,10 @@ int put_timespec64(const struct timespec64 *ts, ...@@ -863,10 +863,10 @@ int put_timespec64(const struct timespec64 *ts,
} }
EXPORT_SYMBOL_GPL(put_timespec64); EXPORT_SYMBOL_GPL(put_timespec64);
int __compat_get_timespec64(struct timespec64 *ts64, int __get_old_timespec32(struct timespec64 *ts64,
const struct compat_timespec __user *cts) const struct old_timespec32 __user *cts)
{ {
struct compat_timespec ts; struct old_timespec32 ts;
int ret; int ret;
ret = copy_from_user(&ts, cts, sizeof(ts)); ret = copy_from_user(&ts, cts, sizeof(ts));
...@@ -879,33 +879,33 @@ int __compat_get_timespec64(struct timespec64 *ts64, ...@@ -879,33 +879,33 @@ int __compat_get_timespec64(struct timespec64 *ts64,
return 0; return 0;
} }
int __compat_put_timespec64(const struct timespec64 *ts64, int __put_old_timespec32(const struct timespec64 *ts64,
struct compat_timespec __user *cts) struct old_timespec32 __user *cts)
{ {
struct compat_timespec ts = { struct old_timespec32 ts = {
.tv_sec = ts64->tv_sec, .tv_sec = ts64->tv_sec,
.tv_nsec = ts64->tv_nsec .tv_nsec = ts64->tv_nsec
}; };
return copy_to_user(cts, &ts, sizeof(ts)) ? -EFAULT : 0; return copy_to_user(cts, &ts, sizeof(ts)) ? -EFAULT : 0;
} }
int compat_get_timespec64(struct timespec64 *ts, const void __user *uts) int get_old_timespec32(struct timespec64 *ts, const void __user *uts)
{ {
if (COMPAT_USE_64BIT_TIME) if (COMPAT_USE_64BIT_TIME)
return copy_from_user(ts, uts, sizeof(*ts)) ? -EFAULT : 0; return copy_from_user(ts, uts, sizeof(*ts)) ? -EFAULT : 0;
else else
return __compat_get_timespec64(ts, uts); return __get_old_timespec32(ts, uts);
} }
EXPORT_SYMBOL_GPL(compat_get_timespec64); EXPORT_SYMBOL_GPL(get_old_timespec32);
int compat_put_timespec64(const struct timespec64 *ts, void __user *uts) int put_old_timespec32(const struct timespec64 *ts, void __user *uts)
{ {
if (COMPAT_USE_64BIT_TIME) if (COMPAT_USE_64BIT_TIME)
return copy_to_user(uts, ts, sizeof(*ts)) ? -EFAULT : 0; return copy_to_user(uts, ts, sizeof(*ts)) ? -EFAULT : 0;
else else
return __compat_put_timespec64(ts, uts); return __put_old_timespec32(ts, uts);
} }
EXPORT_SYMBOL_GPL(compat_put_timespec64); EXPORT_SYMBOL_GPL(put_old_timespec32);
int get_itimerspec64(struct itimerspec64 *it, int get_itimerspec64(struct itimerspec64 *it,
const struct __kernel_itimerspec __user *uit) const struct __kernel_itimerspec __user *uit)
...@@ -937,23 +937,23 @@ int put_itimerspec64(const struct itimerspec64 *it, ...@@ -937,23 +937,23 @@ int put_itimerspec64(const struct itimerspec64 *it,
} }
EXPORT_SYMBOL_GPL(put_itimerspec64); EXPORT_SYMBOL_GPL(put_itimerspec64);
int get_compat_itimerspec64(struct itimerspec64 *its, int get_old_itimerspec32(struct itimerspec64 *its,
const struct compat_itimerspec __user *uits) const struct old_itimerspec32 __user *uits)
{ {
if (__compat_get_timespec64(&its->it_interval, &uits->it_interval) || if (__get_old_timespec32(&its->it_interval, &uits->it_interval) ||
__compat_get_timespec64(&its->it_value, &uits->it_value)) __get_old_timespec32(&its->it_value, &uits->it_value))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(get_compat_itimerspec64); EXPORT_SYMBOL_GPL(get_old_itimerspec32);
int put_compat_itimerspec64(const struct itimerspec64 *its, int put_old_itimerspec32(const struct itimerspec64 *its,
struct compat_itimerspec __user *uits) struct old_itimerspec32 __user *uits)
{ {
if (__compat_put_timespec64(&its->it_interval, &uits->it_interval) || if (__put_old_timespec32(&its->it_interval, &uits->it_interval) ||
__compat_put_timespec64(&its->it_value, &uits->it_value)) __put_old_timespec32(&its->it_value, &uits->it_value))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(put_compat_itimerspec64); EXPORT_SYMBOL_GPL(put_old_itimerspec32);
...@@ -812,7 +812,7 @@ COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, buf, compat_size_t, len ...@@ -812,7 +812,7 @@ COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, buf, compat_size_t, len
static int __compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg, static int __compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
unsigned int vlen, unsigned int flags, unsigned int vlen, unsigned int flags,
struct compat_timespec __user *timeout) struct old_timespec32 __user *timeout)
{ {
int datagrams; int datagrams;
struct timespec ktspec; struct timespec ktspec;
...@@ -834,7 +834,7 @@ static int __compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg, ...@@ -834,7 +834,7 @@ static int __compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg, COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
unsigned int, vlen, unsigned int, flags, unsigned int, vlen, unsigned int, flags,
struct compat_timespec __user *, timeout) struct old_timespec32 __user *, timeout)
{ {
return __compat_sys_recvmmsg(fd, mmsg, vlen, flags, timeout); return __compat_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment