linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/7] Isolate time_t data types for clock/timer syscalls
@ 2017-06-24 18:24 Deepa Dinamani
  2017-06-24 18:24 ` [PATCH v2 1/7] time: add get_timespec64 and put_timespec64 Deepa Dinamani
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Deepa Dinamani @ 2017-06-24 18:24 UTC (permalink / raw)
  To: tglx, viro, linux-kernel
  Cc: john.stultz, nicolas.pitre, arnd, y2038, linux-fsdevel

The series aims at isolating data conversions of time_t based structures:
struct timespec and struct itimerspec at user space boundaries.
This helps to later change the underlying types to handle y2038 changes
to these.

The series is an update to Arnd Bergmann's previous series:
http://sourceware.org/ml/libc-alpha/2015-05/msg00070.html

Changes since v1:
* Rebased and removed common code paths on the tip linux-next.

Deepa Dinamani (7):
  time: add get_timespec64 and put_timespec64
  time: introduce {get,put}_itimerspec64
  posix-stubs: Conditionally include COMPAT_SYS_NI defines
  posix-timers: Use get_timepsec64() and put_timespec64()
  nanosleep: Use get_timepsec64() and put_timespec64()
  timerfd: Use get_itimerspec64() and put_itimerspec64()
  posix_clocks: Use get_itimerspec64() and  put_itimerspec64()

 fs/timerfd.c                   |  43 +++++++------
 include/linux/compat.h         |   6 ++
 include/linux/hrtimer.h        |   2 +-
 include/linux/posix-timers.h   |   1 -
 include/linux/time.h           |  18 ++++++
 kernel/compat.c                |  65 ++++++++++++++++++++
 kernel/time/alarmtimer.c       |   4 +-
 kernel/time/hrtimer.c          |  30 ++++------
 kernel/time/posix-cpu-timers.c |   8 +--
 kernel/time/posix-stubs.c      |  99 ++++++++++++++++--------------
 kernel/time/posix-timers.c     | 133 +++++++++++++++--------------------------
 kernel/time/time.c             |  58 ++++++++++++++++++
 12 files changed, 289 insertions(+), 178 deletions(-)

-- 
2.11.0

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v2 1/7] time: add get_timespec64 and put_timespec64
  2017-06-24 18:24 [PATCH v2 0/7] Isolate time_t data types for clock/timer syscalls Deepa Dinamani
@ 2017-06-24 18:24 ` Deepa Dinamani
  2017-06-24 18:24 ` [PATCH v2 2/7] time: introduce {get,put}_itimerspec64 Deepa Dinamani
  2017-06-24 18:24 ` [PATCH v2 3/7] posix-stubs: Conditionally include COMPAT_SYS_NI defines Deepa Dinamani
  2 siblings, 0 replies; 4+ messages in thread
From: Deepa Dinamani @ 2017-06-24 18:24 UTC (permalink / raw)
  To: tglx, viro, linux-kernel
  Cc: john.stultz, nicolas.pitre, arnd, y2038, linux-fsdevel

Add helper functions to convert between struct timespec64 and
struct timespec at userspace boundaries.

This is a preparatory patch to use timespec64 as the basic type
internally in the kernel as timespec is not y2038 safe on 32 bit systems.
The patch helps the cause by containing all data conversions at the
userspace boundaries within these functions.

Suggested-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
 include/linux/compat.h |  2 ++
 include/linux/time.h   |  5 +++++
 kernel/compat.c        | 44 ++++++++++++++++++++++++++++++++++++++++++++
 kernel/time/time.c     | 28 ++++++++++++++++++++++++++++
 4 files changed, 79 insertions(+)

diff --git a/include/linux/compat.h b/include/linux/compat.h
index 425563c7647b..3eb04016ffa9 100644
--- a/include/linux/compat.h
+++ b/include/linux/compat.h
@@ -164,6 +164,8 @@ extern int compat_get_timespec(struct timespec *, const void __user *);
 extern int compat_put_timespec(const struct timespec *, void __user *);
 extern int compat_get_timeval(struct timeval *, const void __user *);
 extern int compat_put_timeval(const struct timeval *, void __user *);
+extern int compat_get_timespec64(struct timespec64 *, const void __user *);
+extern int compat_put_timespec64(const struct timespec64 *, void __user *);
 
 /*
  * This function convert a timespec if necessary and returns a *user
diff --git a/include/linux/time.h b/include/linux/time.h
index c0543f5f25de..36afb579495f 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -8,6 +8,11 @@
 
 extern struct timezone sys_tz;
 
+int get_timespec64(struct timespec64 *ts,
+		const struct timespec __user *uts);
+int put_timespec64(const struct timespec64 *ts,
+		struct timespec __user *uts);
+
 #define TIME_T_MAX	(time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
 
 static inline int timespec_equal(const struct timespec *a,
diff --git a/kernel/compat.c b/kernel/compat.c
index ebd8bdc3fd68..73f26ba44a8a 100644
--- a/kernel/compat.c
+++ b/kernel/compat.c
@@ -120,6 +120,50 @@ static int __compat_put_timespec(const struct timespec *ts, struct compat_timesp
 			__put_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0;
 }
 
+static int __compat_get_timespec64(struct timespec64 *ts64,
+				   const struct compat_timespec __user *cts)
+{
+	struct compat_timespec ts;
+	int ret;
+
+	ret = copy_from_user(&ts, cts, sizeof(ts));
+	if (ret)
+		return -EFAULT;
+
+	ts64->tv_sec = ts.tv_sec;
+	ts64->tv_nsec = ts.tv_nsec;
+
+	return 0;
+}
+
+static int __compat_put_timespec64(const struct timespec64 *ts64,
+				   struct compat_timespec __user *cts)
+{
+	struct compat_timespec ts = {
+		.tv_sec = ts64->tv_sec,
+		.tv_nsec = ts64->tv_nsec
+	};
+	return copy_to_user(cts, &ts, sizeof(ts)) ? -EFAULT : 0;
+}
+
+int compat_get_timespec64(struct timespec64 *ts, const void __user *uts)
+{
+	if (COMPAT_USE_64BIT_TIME)
+		return copy_from_user(ts, uts, sizeof(*ts)) ? -EFAULT : 0;
+	else
+		return __compat_get_timespec64(ts, uts);
+}
+EXPORT_SYMBOL_GPL(compat_get_timespec64);
+
+int compat_put_timespec64(const struct timespec64 *ts, void __user *uts)
+{
+	if (COMPAT_USE_64BIT_TIME)
+		return copy_to_user(uts, ts, sizeof(*ts)) ? -EFAULT : 0;
+	else
+		return __compat_put_timespec64(ts, uts);
+}
+EXPORT_SYMBOL_GPL(compat_put_timespec64);
+
 int compat_get_timeval(struct timeval *tv, const void __user *utv)
 {
 	if (COMPAT_USE_64BIT_TIME)
diff --git a/kernel/time/time.c b/kernel/time/time.c
index 7c89e437c4d7..adb9853ca6b0 100644
--- a/kernel/time/time.c
+++ b/kernel/time/time.c
@@ -890,3 +890,31 @@ struct timespec64 timespec64_add_safe(const struct timespec64 lhs,
 
 	return res;
 }
+
+int get_timespec64(struct timespec64 *ts,
+		   const struct timespec __user *uts)
+{
+	struct timespec kts;
+	int ret;
+
+	ret = copy_from_user(&kts, uts, sizeof(kts));
+	if (ret)
+		return -EFAULT;
+
+	ts->tv_sec = kts.tv_sec;
+	ts->tv_nsec = kts.tv_nsec;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(get_timespec64);
+
+int put_timespec64(const struct timespec64 *ts,
+		   struct timespec __user *uts)
+{
+	struct timespec kts = {
+		.tv_sec = ts->tv_sec,
+		.tv_nsec = ts->tv_nsec
+	};
+	return copy_to_user(uts, &kts, sizeof(kts)) ? -EFAULT : 0;
+}
+EXPORT_SYMBOL_GPL(put_timespec64);
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 2/7] time: introduce {get,put}_itimerspec64
  2017-06-24 18:24 [PATCH v2 0/7] Isolate time_t data types for clock/timer syscalls Deepa Dinamani
  2017-06-24 18:24 ` [PATCH v2 1/7] time: add get_timespec64 and put_timespec64 Deepa Dinamani
@ 2017-06-24 18:24 ` Deepa Dinamani
  2017-06-24 18:24 ` [PATCH v2 3/7] posix-stubs: Conditionally include COMPAT_SYS_NI defines Deepa Dinamani
  2 siblings, 0 replies; 4+ messages in thread
From: Deepa Dinamani @ 2017-06-24 18:24 UTC (permalink / raw)
  To: tglx, viro, linux-kernel
  Cc: john.stultz, nicolas.pitre, arnd, y2038, linux-fsdevel

As we change the user space type for the timerfd and posix timer
functions to newer data types, we need some form of conversion
helpers to avoid duplicating that logic.

Suggested-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
 include/linux/compat.h       |  4 ++++
 include/linux/posix-timers.h |  1 -
 include/linux/time.h         | 13 +++++++++++++
 kernel/compat.c              | 21 +++++++++++++++++++++
 kernel/time/time.c           | 30 ++++++++++++++++++++++++++++++
 5 files changed, 68 insertions(+), 1 deletion(-)

diff --git a/include/linux/compat.h b/include/linux/compat.h
index 3eb04016ffa9..2ed54020ace0 100644
--- a/include/linux/compat.h
+++ b/include/linux/compat.h
@@ -166,6 +166,10 @@ extern int compat_get_timeval(struct timeval *, const void __user *);
 extern int compat_put_timeval(const struct timeval *, void __user *);
 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);
 
 /*
  * This function convert a timespec if necessary and returns a *user
diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h
index 29f1b7f09ced..62839fd04dce 100644
--- a/include/linux/posix-timers.h
+++ b/include/linux/posix-timers.h
@@ -113,5 +113,4 @@ void set_process_cpu_timer(struct task_struct *task, unsigned int clock_idx,
 void update_rlimit_cpu(struct task_struct *task, unsigned long rlim_new);
 
 void posixtimer_rearm(struct siginfo *info);
-
 #endif
diff --git a/include/linux/time.h b/include/linux/time.h
index 36afb579495f..f9858d7e6361 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -12,6 +12,10 @@ int get_timespec64(struct timespec64 *ts,
 		const struct timespec __user *uts);
 int put_timespec64(const struct timespec64 *ts,
 		struct timespec __user *uts);
+int get_itimerspec64(struct itimerspec64 *it,
+			const struct itimerspec __user *uit);
+int put_itimerspec64(const struct itimerspec64 *it,
+			struct itimerspec __user *uit);
 
 #define TIME_T_MAX	(time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
 
@@ -275,4 +279,13 @@ static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
 	a->tv_nsec = ns;
 }
 
+static inline bool itimerspec64_valid(const struct itimerspec64 *its)
+{
+	if (!timespec64_valid(&(its->it_interval)) ||
+		!timespec64_valid(&(its->it_value)))
+		return false;
+
+	return true;
+}
+
 #endif
diff --git a/kernel/compat.c b/kernel/compat.c
index 73f26ba44a8a..a350deda503a 100644
--- a/kernel/compat.c
+++ b/kernel/compat.c
@@ -586,6 +586,27 @@ int put_compat_itimerspec(struct compat_itimerspec __user *dst,
 	return 0;
 }
 
+int get_compat_itimerspec64(struct itimerspec64 *its,
+			const struct compat_itimerspec __user *uits)
+{
+
+	if (__compat_get_timespec64(&its->it_interval, &uits->it_interval) ||
+	    __compat_get_timespec64(&its->it_value, &uits->it_value))
+		return -EFAULT;
+	return 0;
+}
+EXPORT_SYMBOL_GPL(get_compat_itimerspec64);
+
+int put_compat_itimerspec64(const struct itimerspec64 *its,
+			struct compat_itimerspec __user *uits)
+{
+	if (__compat_put_timespec64(&its->it_interval, &uits->it_interval) ||
+	    __compat_put_timespec64(&its->it_value, &uits->it_value))
+		return -EFAULT;
+	return 0;
+}
+EXPORT_SYMBOL_GPL(put_compat_itimerspec64);
+
 /*
  * We currently only need the following fields from the sigevent
  * structure: sigev_value, sigev_signo, sig_notify and (sometimes
diff --git a/kernel/time/time.c b/kernel/time/time.c
index adb9853ca6b0..44a8c1402133 100644
--- a/kernel/time/time.c
+++ b/kernel/time/time.c
@@ -918,3 +918,33 @@ int put_timespec64(const struct timespec64 *ts,
 	return copy_to_user(uts, &kts, sizeof(kts)) ? -EFAULT : 0;
 }
 EXPORT_SYMBOL_GPL(put_timespec64);
+
+int get_itimerspec64(struct itimerspec64 *it,
+			const struct itimerspec __user *uit)
+{
+	int ret;
+
+	ret = get_timespec64(&it->it_interval, &uit->it_interval);
+	if (ret)
+		return ret;
+
+	ret = get_timespec64(&it->it_value, &uit->it_value);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(get_itimerspec64);
+
+int put_itimerspec64(const struct itimerspec64 *it,
+			struct itimerspec __user *uit)
+{
+	int ret;
+
+	ret = put_timespec64(&it->it_interval, &uit->it_interval);
+	if (ret)
+		return ret;
+
+	ret = put_timespec64(&it->it_value, &uit->it_value);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(put_itimerspec64);
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 3/7] posix-stubs: Conditionally include COMPAT_SYS_NI defines
  2017-06-24 18:24 [PATCH v2 0/7] Isolate time_t data types for clock/timer syscalls Deepa Dinamani
  2017-06-24 18:24 ` [PATCH v2 1/7] time: add get_timespec64 and put_timespec64 Deepa Dinamani
  2017-06-24 18:24 ` [PATCH v2 2/7] time: introduce {get,put}_itimerspec64 Deepa Dinamani
@ 2017-06-24 18:24 ` Deepa Dinamani
  2 siblings, 0 replies; 4+ messages in thread
From: Deepa Dinamani @ 2017-06-24 18:24 UTC (permalink / raw)
  To: tglx, viro, linux-kernel
  Cc: john.stultz, nicolas.pitre, arnd, y2038, linux-fsdevel

These apis are only to be defined if CONFIG_COMPAT is
enabled.

Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
 kernel/time/posix-stubs.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/kernel/time/posix-stubs.c b/kernel/time/posix-stubs.c
index 38f3b20efa29..ac0a6b76ddd8 100644
--- a/kernel/time/posix-stubs.c
+++ b/kernel/time/posix-stubs.c
@@ -41,12 +41,6 @@ SYS_NI(setitimer);
 #ifdef __ARCH_WANT_SYS_ALARM
 SYS_NI(alarm);
 #endif
-COMPAT_SYS_NI(timer_create);
-COMPAT_SYS_NI(clock_adjtime);
-COMPAT_SYS_NI(timer_settime);
-COMPAT_SYS_NI(timer_gettime);
-COMPAT_SYS_NI(getitimer);
-COMPAT_SYS_NI(setitimer);
 
 /*
  * We preserve minimal support for CLOCK_REALTIME and CLOCK_MONOTONIC
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2017-06-24 18:27 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-24 18:24 [PATCH v2 0/7] Isolate time_t data types for clock/timer syscalls Deepa Dinamani
2017-06-24 18:24 ` [PATCH v2 1/7] time: add get_timespec64 and put_timespec64 Deepa Dinamani
2017-06-24 18:24 ` [PATCH v2 2/7] time: introduce {get,put}_itimerspec64 Deepa Dinamani
2017-06-24 18:24 ` [PATCH v2 3/7] posix-stubs: Conditionally include COMPAT_SYS_NI defines Deepa Dinamani

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).