diff options
author | pang.xunlei <pang.xunlei@linaro.org> | 2014-11-18 06:15:18 -0500 |
---|---|---|
committer | John Stultz <john.stultz@linaro.org> | 2014-11-21 14:59:58 -0500 |
commit | 90b6ce9c4066e0b2098dff65e52e6e7df1a51079 (patch) | |
tree | d92267d1b186332bdc827850e72c3f7a4b0b600b /kernel/time | |
parent | 04d9089086a8231ddc69a9f3f25e971a3c1d25e6 (diff) |
time: Provide y2038 safe mktime() replacement
As part of addressing "y2038 problem" for in-kernel uses, this
patch adds safe mktime64() using time64_t.
After this patch, mktime() is deprecated and all its call sites
will be fixed using mktime64(), after that it can be removed.
Signed-off-by: pang.xunlei <pang.xunlei@linaro.org>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'kernel/time')
-rw-r--r-- | kernel/time/time.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/kernel/time/time.c b/kernel/time/time.c index a9ae20fb0b11..65015ff2f07c 100644 --- a/kernel/time/time.c +++ b/kernel/time/time.c | |||
@@ -304,7 +304,9 @@ struct timespec timespec_trunc(struct timespec t, unsigned gran) | |||
304 | } | 304 | } |
305 | EXPORT_SYMBOL(timespec_trunc); | 305 | EXPORT_SYMBOL(timespec_trunc); |
306 | 306 | ||
307 | /* Converts Gregorian date to seconds since 1970-01-01 00:00:00. | 307 | /* |
308 | * mktime64 - Converts date to seconds. | ||
309 | * Converts Gregorian date to seconds since 1970-01-01 00:00:00. | ||
308 | * Assumes input in normal date format, i.e. 1980-12-31 23:59:59 | 310 | * Assumes input in normal date format, i.e. 1980-12-31 23:59:59 |
309 | * => year=1980, mon=12, day=31, hour=23, min=59, sec=59. | 311 | * => year=1980, mon=12, day=31, hour=23, min=59, sec=59. |
310 | * | 312 | * |
@@ -314,15 +316,10 @@ EXPORT_SYMBOL(timespec_trunc); | |||
314 | * -year/100+year/400 terms, and add 10.] | 316 | * -year/100+year/400 terms, and add 10.] |
315 | * | 317 | * |
316 | * This algorithm was first published by Gauss (I think). | 318 | * This algorithm was first published by Gauss (I think). |
317 | * | ||
318 | * WARNING: this function will overflow on 2106-02-07 06:28:16 on | ||
319 | * machines where long is 32-bit! (However, as time_t is signed, we | ||
320 | * will already get problems at other places on 2038-01-19 03:14:08) | ||
321 | */ | 319 | */ |
322 | unsigned long | 320 | time64_t mktime64(const unsigned int year0, const unsigned int mon0, |
323 | mktime(const unsigned int year0, const unsigned int mon0, | 321 | const unsigned int day, const unsigned int hour, |
324 | const unsigned int day, const unsigned int hour, | 322 | const unsigned int min, const unsigned int sec) |
325 | const unsigned int min, const unsigned int sec) | ||
326 | { | 323 | { |
327 | unsigned int mon = mon0, year = year0; | 324 | unsigned int mon = mon0, year = year0; |
328 | 325 | ||
@@ -332,15 +329,14 @@ mktime(const unsigned int year0, const unsigned int mon0, | |||
332 | year -= 1; | 329 | year -= 1; |
333 | } | 330 | } |
334 | 331 | ||
335 | return ((((unsigned long) | 332 | return ((((time64_t) |
336 | (year/4 - year/100 + year/400 + 367*mon/12 + day) + | 333 | (year/4 - year/100 + year/400 + 367*mon/12 + day) + |
337 | year*365 - 719499 | 334 | year*365 - 719499 |
338 | )*24 + hour /* now have hours */ | 335 | )*24 + hour /* now have hours */ |
339 | )*60 + min /* now have minutes */ | 336 | )*60 + min /* now have minutes */ |
340 | )*60 + sec; /* finally seconds */ | 337 | )*60 + sec; /* finally seconds */ |
341 | } | 338 | } |
342 | 339 | EXPORT_SYMBOL(mktime64); | |
343 | EXPORT_SYMBOL(mktime); | ||
344 | 340 | ||
345 | /** | 341 | /** |
346 | * set_normalized_timespec - set timespec sec and nsec parts and normalize | 342 | * set_normalized_timespec - set timespec sec and nsec parts and normalize |