This patch introduces the do_sys_settimeofday64() function with timespec64 type, that makes this function ready for 2038 issue when setting the time of day. And moves the do_sys_settimeofday() function to the timekeeping.h file.
Signed-off-by: Baolin Wang baolin.wang@linaro.org --- include/linux/timekeeping.h | 12 ++++++++++-- kernel/time/time.c | 10 ++++++---- 2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h index c6d5ae9..89beb62 100644 --- a/include/linux/timekeeping.h +++ b/include/linux/timekeeping.h @@ -11,8 +11,16 @@ extern int timekeeping_suspended; */ extern void do_gettimeofday(struct timeval *tv); extern int do_settimeofday64(const struct timespec64 *ts); -extern int do_sys_settimeofday(const struct timespec *tv, - const struct timezone *tz); +extern int do_sys_settimeofday64(const struct timespec64 *tv, + const struct timezone *tz); +static inline int do_sys_settimeofday(const struct timespec *tv, + const struct timezone *tz) +{ + struct timespec64 ts64; + + ts64 = timespec_to_timespec64(*tv); + return do_sys_settimeofday64(&ts64, tz); +}
/* * Kernel time accessors diff --git a/kernel/time/time.c b/kernel/time/time.c index 2c85b77..f43011b 100644 --- a/kernel/time/time.c +++ b/kernel/time/time.c @@ -160,15 +160,17 @@ static inline void warp_clock(void) * various programs will get confused when the clock gets warped. */
-int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz) +int do_sys_settimeofday64(const struct timespec64 *tv, const struct timezone *tz) { static int firsttime = 1; int error = 0; + struct timespec ts;
- if (tv && !timespec_valid(tv)) + if (tv && !timespec64_valid(tv)) return -EINVAL;
- error = security_settime(tv, tz); + ts = timespec64_to_timespec(*tv); + error = security_settime(&ts, tz); if (error) return error;
@@ -182,7 +184,7 @@ int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz) } } if (tv) - return do_settimeofday(tv); + return do_settimeofday64(tv); return 0; }
On Mon, 11 May 2015, Baolin Wang wrote:
This patch introduces the do_sys_settimeofday64() function with timespec64 type, that makes this function ready for 2038 issue when setting the time of day.
Copy and paste is your favourite work method, right?
-int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz) +int do_sys_settimeofday64(const struct timespec64 *tv, const struct timezone *tz) { static int firsttime = 1; int error = 0;
- struct timespec ts;
- if (tv && !timespec_valid(tv))
- if (tv && !timespec64_valid(tv)) return -EINVAL;
- error = security_settime(tv, tz);
- ts = timespec64_to_timespec(*tv);
- error = security_settime(&ts, tz);
How is that 2038 safe? Not at all.
I told you before that we fix the underlying functions before we add such bogosities.
Thanks,
tglx
On 12 May 2015 at 23:17, Thomas Gleixner tglx@linutronix.de wrote:
On Mon, 11 May 2015, Baolin Wang wrote:
This patch introduces the do_sys_settimeofday64() function with
timespec64
type, that makes this function ready for 2038 issue when setting the
time of day.
Copy and paste is your favourite work method, right?
-int do_sys_settimeofday(const struct timespec *tv, const struct
timezone *tz)
+int do_sys_settimeofday64(const struct timespec64 *tv, const struct
timezone *tz)
{ static int firsttime = 1; int error = 0;
struct timespec ts;
if (tv && !timespec_valid(tv))
if (tv && !timespec64_valid(tv)) return -EINVAL;
error = security_settime(tv, tz);
ts = timespec64_to_timespec(*tv);
error = security_settime(&ts, tz);
How is that 2038 safe? Not at all.
I told you before that we fix the underlying functions before we add such bogosities.
Thanks,
tglx
Thanks for your comments, and i'll continue to repair my patch. But could you explain what the defects in do_sys_settimeofday64 function? Thanks.
On Wednesday 13 May 2015 10:43:25 Baolin Wang wrote:
-int do_sys_settimeofday(const struct timespec *tv, const struct
timezone *tz)
+int do_sys_settimeofday64(const struct timespec64 *tv, const struct
timezone *tz)
{ static int firsttime = 1; int error = 0;
struct timespec ts;
if (tv && !timespec_valid(tv))
if (tv && !timespec64_valid(tv)) return -EINVAL;
error = security_settime(tv, tz);
ts = timespec64_to_timespec(*tv);
error = security_settime(&ts, tz);
How is that 2038 safe? Not at all.
I told you before that we fix the underlying functions before we add such bogosities.
Thanks for your comments, and i'll continue to repair my patch. But could you explain what the defects in do_sys_settimeofday64 function? Thanks.
What Thomas meant here is that you should first fix security_settime to take a timespec64 argument. I guess you could introduce a security_settime64() function first, using another inline wrapper to provide the existing security_settime() API. security_settime() does not actually use the time argument, so this is a fairly easy thing to do.
Arnd
On 13 May 2015 at 15:55, Arnd Bergmann arnd@arndb.de wrote:
On Wednesday 13 May 2015 10:43:25 Baolin Wang wrote:
-int do_sys_settimeofday(const struct timespec *tv, const struct
timezone *tz)
+int do_sys_settimeofday64(const struct timespec64 *tv, const struct
timezone *tz)
{ static int firsttime = 1; int error = 0;
struct timespec ts;
if (tv && !timespec_valid(tv))
if (tv && !timespec64_valid(tv)) return -EINVAL;
error = security_settime(tv, tz);
ts = timespec64_to_timespec(*tv);
error = security_settime(&ts, tz);
How is that 2038 safe? Not at all.
I told you before that we fix the underlying functions before we add such bogosities.
Thanks for your comments, and i'll continue to repair my patch. But could you explain what the defects in do_sys_settimeofday64 function? Thanks.
What Thomas meant here is that you should first fix security_settime to take a timespec64 argument. I guess you could introduce a security_settime64() function first, using another inline wrapper to provide the existing security_settime() API. security_settime() does not actually use the time argument, so this is a fairly easy thing to do.
Arnd
Hi Arnd,
Thanks for your comments, i'll try to introduce the new security_settime64() function as we talked in private. Thanks.