krb5 commit: Fix gmt_mktime for y2038
Greg Hudson
ghudson at mit.edu
Wed May 31 11:33:54 EDT 2017
https://github.com/krb5/krb5/commit/7e41d97e8dd39833503b74d34e9f0c905a2d4cf2
commit 7e41d97e8dd39833503b74d34e9f0c905a2d4cf2
Author: Greg Hudson <ghudson at mit.edu>
Date: Fri May 26 16:20:11 2017 -0400
Fix gmt_mktime for y2038
gmt_mktime() is used as a fallback when the platform does not have
timegm(). Make it work for dates in the unsigned 32-bit range, not
the signed 32-bit range.
ticket: 8352
src/util/support/gmt_mktime.c | 17 ++++++++---------
1 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/src/util/support/gmt_mktime.c b/src/util/support/gmt_mktime.c
index 32fef43..ac7752f 100644
--- a/src/util/support/gmt_mktime.c
+++ b/src/util/support/gmt_mktime.c
@@ -78,21 +78,20 @@ static const int days_in_month[12] = {
static time_t
gmt_mktime(struct tm *t)
{
- time_t accum;
+ uint32_t accum;
#define assert_time(cnd) if(!(cnd)) return (time_t) -1
/*
- * For 32-bit signed time_t centered on 1/1/1970, the range is:
- * time 0x80000000 -> Fri Dec 13 16:45:52 1901
- * time 0x7fffffff -> Mon Jan 18 22:14:07 2038
+ * For 32-bit unsigned time values starting on 1/1/1970, the range is:
+ * time 0x00000000 -> Thu Jan 1 00:00:00 1970
+ * time 0xffffffff -> Sun Feb 7 06:28:15 2106
*
- * So years 1901 and 2038 are allowable, but we can't encode all
- * dates in those years, and we're not doing overflow/underflow
- * checking for such cases.
+ * We can't encode all dates in 2106, and we're not doing overflow checking
+ * for such cases.
*/
- assert_time(t->tm_year>=1);
- assert_time(t->tm_year<=138);
+ assert_time(t->tm_year>=70);
+ assert_time(t->tm_year<=206);
assert_time(t->tm_mon>=0);
assert_time(t->tm_mon<=11);
More information about the cvs-krb5
mailing list