unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] y2038: linux: Provide __time64 implementation
@ 2020-10-15 12:34 Lukasz Majewski
  2020-10-15 13:03 ` Adhemerval Zanella via Libc-alpha
  0 siblings, 1 reply; 3+ messages in thread
From: Lukasz Majewski @ 2020-10-15 12:34 UTC (permalink / raw)
  To: Joseph Myers, Paul Eggert, Adhemerval Zanella
  Cc: Florian Weimer, GNU C Library, Andreas Schwab, Stepan Golosunov,
	Alistair Francis

In the glibc the time function can use vDSO (on power and x86 the
USE_IFUNC_TIME is defined), time syscall or 'default' time() from
./time/time.c (as a fallback).

In this patch the last function (time) has been refactored and moved
to ./sysdeps/unix/sysv/linux/time.c to be Linux specific.

The new __time64 explicit 64 bit function for providing 64 bit value of
seconds after epoch (by internally calling __clock_gettime64) has been
introduced.

Moreover, a 32 bit version - __time has been refactored to internally
use __time64.

The __time is now supposed to be used on systems still supporting 32 bit
time (__TIMESIZE != 64) - hence the necessary check for time_t potential
overflow.

Build tests:
./src/scripts/build-many-glibcs.py glibcs

Run-time tests:
- Run specific tests on ARM/x86 32bit systems (qemu):
https://github.com/lmajewski/meta-y2038 and run tests:
https://github.com/lmajewski/y2038-tests/commits/master

Above tests were performed with Y2038 redirection applied as well as without
to test proper usage of both __time64 and __time.
---
 include/time.h                 |  7 ++++++
 sysdeps/unix/sysv/linux/time.c | 39 +++++++++++++++++++++++++++++++++-
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/include/time.h b/include/time.h
index edf6cdf829..caf2af5e74 100644
--- a/include/time.h
+++ b/include/time.h
@@ -317,6 +317,13 @@ extern int __timespec_get64 (struct __timespec64 *ts, int base);
 libc_hidden_proto (__timespec_get64)
 #endif
 
+#if __TIMESIZE == 64
+# define __time64 __time
+#else
+extern __time64_t __time64 (__time64_t *timer);
+libc_hidden_proto (__time64)
+#endif
+
 /* Use in the clock_* functions.  Size of the field representing the
    actual clock ID.  */
 #define CLOCK_IDFIELD_SIZE	3
diff --git a/sysdeps/unix/sysv/linux/time.c b/sysdeps/unix/sysv/linux/time.c
index 9d8e573c0a..1a9a7c0413 100644
--- a/sysdeps/unix/sysv/linux/time.c
+++ b/sysdeps/unix/sysv/linux/time.c
@@ -47,5 +47,42 @@ time (time_t *t)
 }
 # endif /* !SHARED */
 #else /* USE_IFUNC_TIME  */
-# include <time/time.c>
+/* Conversion of time function to support 64 bit time on archs
+   with __WORDSIZE == 32 and __TIMESIZE == 32/64  */
+# include <time.h>
+# include <time-clockid.h>
+# include <errno.h>
+/* Return the time now, and store it in *TIMER if not NULL.  */
+
+__time64_t
+__time64 (__time64_t *timer)
+{
+  struct __timespec64 ts;
+  __clock_gettime64 (TIME_CLOCK_GETTIME_CLOCKID, &ts);
+
+  if (timer)
+    *timer = ts.tv_sec;
+  return ts.tv_sec;
+}
+
+# if __TIMESIZE != 64
+libc_hidden_def (__time64)
+
+time_t
+__time (time_t *timer)
+{
+  __time64_t t = __time64 (NULL);
+
+  if (! in_time_t_range (t))
+    {
+      __set_errno (EOVERFLOW);
+      return -1;
+    }
+
+  if (timer)
+    *timer = t;
+  return t;
+}
+# endif
+weak_alias (__time, time)
 #endif
-- 
2.20.1


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

end of thread, other threads:[~2020-10-16 10:19 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-15 12:34 [PATCH] y2038: linux: Provide __time64 implementation Lukasz Majewski
2020-10-15 13:03 ` Adhemerval Zanella via Libc-alpha
2020-10-16 10:18   ` Lukasz Majewski

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 read-only IMAP folder(s) and NNTP newsgroup(s).