This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH 1/2] y2038: Helper macro to convert struct __timespec64 to struct timespec
- From: Lukasz Majewski <lukma at denx dot de>
- To: Joseph Myers <joseph at codesourcery dot com>, Paul Eggert <eggert at cs dot ucla dot edu>
- Cc: Alistair Francis <alistair23 at gmail dot com>, Arnd Bergmann <arnd at arndb dot de>, Alistair Francis <alistair dot francis at wdc dot com>, GNU C Library <libc-alpha at sourceware dot org>, Adhemerval Zanella <adhemerval dot zanella at linaro dot org>, Florian Weimer <fweimer at redhat dot com>, Carlos O'Donell <carlos at redhat dot com>, Stepan Golosunov <stepan at golosunov dot pp dot ru>, Florian Weimer <fw at deneb dot enyo dot de>, Zack Weinberg <zackw at panix dot com>, Lukasz Majewski <lukma at denx dot de>
- Date: Fri, 18 Oct 2019 16:57:19 +0200
- Subject: [PATCH 1/2] y2038: Helper macro to convert struct __timespec64 to struct timespec
This macro allows conversion between Y2038 safe struct __timespec64 and
struct timespec.
The struct __timespec64's tv_nsec field is checked if it is in the correct
range.
Moreover, the tv_sec is asserted if it fits into the time_t range.
When error is detected the errno is set accordingly and the function, which
uses this macro returns -1.
Tested with scripts/build-many-glibcs.py script.
---
include/time.h | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/include/time.h b/include/time.h
index d93b16a781..c2b6c9b842 100644
--- a/include/time.h
+++ b/include/time.h
@@ -236,5 +236,28 @@ valid_timespec64_to_timeval (const struct __timespec64 ts64)
return tv;
}
+
+/* Check if a value lies with the valid nanoseconds range. */
+#define IS_VALID_NANOSECONDS(ns) ((ns) >= 0 && (ns) <= 999999999)
+
+/* Check and convert a struct __timespec64 into a struct timespec.
+ This macro checks if the valid number of nanoseconds has been provided
+ by ts64 and if not the errno is set to EINVAL and -1 is returned.
+ Moreover, the number of seconds is check as well, if it is in the time_t
+ range. If not the errno is set to EOVERFLOW and -1 is returned. */
+#define timespec64_to_timespec(ts64) \
+ ({ \
+ if (! IS_VALID_NANOSECONDS (ts64.tv_nsec)) \
+ { \
+ __set_errno (EINVAL); \
+ return -1; \
+ } \
+ if (! in_time_t_range (ts64.tv_sec)) \
+ { \
+ __set_errno (EOVERFLOW); \
+ return -1; \
+ } \
+ valid_timespec64_to_timespec (ts64); })
+
#endif
#endif
--
2.20.1