Skip to content

Commit

Permalink
time: Change nanosleep to safe __kernel_* types
Browse files Browse the repository at this point in the history
Change over clock_nanosleep syscalls to use y2038 safe
__kernel_timespec times. This will enable changing over
of these syscalls to use new y2038 safe syscalls when
the architectures define the CONFIG_64BIT_TIME.

Note that nanosleep syscall is deprecated and does not have a
plan for making it y2038 safe. But, the syscall should work as
before on 64 bit machines and on 32 bit machines, the syscall
works correctly until y2038 as before using the existing compat
syscall version. There is no new syscall for supporting 64 bit
time_t on 32 bit architectures.

Cc: linux-api@vger.kernel.org
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
  • Loading branch information
Deepa Dinamani authored and Arnd Bergmann committed Apr 19, 2018
1 parent 6d5b841 commit 0190997
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 14 deletions.
7 changes: 2 additions & 5 deletions include/linux/restart_block.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <linux/compiler.h>
#include <linux/types.h>
#include <linux/time64.h>

struct timespec;
struct compat_timespec;
Expand All @@ -15,9 +16,7 @@ struct pollfd;
enum timespec_type {
TT_NONE = 0,
TT_NATIVE = 1,
#ifdef CONFIG_COMPAT
TT_COMPAT = 2,
#endif
};

/*
Expand All @@ -40,10 +39,8 @@ struct restart_block {
clockid_t clockid;
enum timespec_type type;
union {
struct timespec __user *rmtp;
#ifdef CONFIG_COMPAT
struct __kernel_timespec __user *rmtp;
struct compat_timespec __user *compat_rmtp;
#endif
};
u64 expires;
} nanosleep;
Expand Down
7 changes: 4 additions & 3 deletions include/linux/syscalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,8 @@ asmlinkage long sys_set_robust_list(struct robust_list_head __user *head,
size_t len);

/* kernel/hrtimer.c */
asmlinkage long sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp);
asmlinkage long sys_nanosleep(struct __kernel_timespec __user *rqtp,
struct __kernel_timespec __user *rmtp);

/* kernel/itimer.c */
asmlinkage long sys_getitimer(int which, struct itimerval __user *value);
Expand Down Expand Up @@ -573,8 +574,8 @@ asmlinkage long sys_clock_gettime(clockid_t which_clock,
asmlinkage long sys_clock_getres(clockid_t which_clock,
struct __kernel_timespec __user *tp);
asmlinkage long sys_clock_nanosleep(clockid_t which_clock, int flags,
const struct timespec __user *rqtp,
struct timespec __user *rmtp);
const struct __kernel_timespec __user *rqtp,
struct __kernel_timespec __user *rmtp);

/* kernel/printk.c */
asmlinkage long sys_syslog(int type, char __user *buf, int len);
Expand Down
8 changes: 6 additions & 2 deletions kernel/time/hrtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -1747,8 +1747,10 @@ long hrtimer_nanosleep(const struct timespec64 *rqtp,
return ret;
}

SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp,
struct timespec __user *, rmtp)
#if !defined(CONFIG_64BIT_TIME) || defined(CONFIG_64BIT)

SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp,
struct __kernel_timespec __user *, rmtp)
{
struct timespec64 tu;

Expand All @@ -1763,6 +1765,8 @@ SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp,
return hrtimer_nanosleep(&tu, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
}

#endif

#ifdef CONFIG_COMPAT_32BIT_TIME

COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp,
Expand Down
4 changes: 2 additions & 2 deletions kernel/time/posix-stubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,8 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, struct __kernel_time
}

SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
const struct timespec __user *, rqtp,
struct timespec __user *, rmtp)
const struct __kernel_timespec __user *, rqtp,
struct __kernel_timespec __user *, rmtp)
{
struct timespec64 t;

Expand Down
4 changes: 2 additions & 2 deletions kernel/time/posix-timers.c
Original file line number Diff line number Diff line change
Expand Up @@ -1212,8 +1212,8 @@ static int common_nsleep(const clockid_t which_clock, int flags,
}

SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
const struct timespec __user *, rqtp,
struct timespec __user *, rmtp)
const struct __kernel_timespec __user *, rqtp,
struct __kernel_timespec __user *, rmtp)
{
const struct k_clock *kc = clockid_to_kclock(which_clock);
struct timespec64 t;
Expand Down

0 comments on commit 0190997

Please sign in to comment.