From b6ab3057f6b68c72eddf26282fae8db7cbffe51e Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Thu, 28 Aug 2008 18:18:12 +0000 Subject: [PATCH] 2008-08-28 Craig Howland * libc/time/mktime.c (mktime): Fix tm_isdst value usage (allowing any positive value from user (per std) rather than depending upon 1). --- newlib/ChangeLog | 6 ++++++ newlib/libc/time/mktime.c | 14 ++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 030499344..d90ddaf63 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,9 @@ +2008-08-28 Craig Howland + + * libc/time/mktime.c (mktime): Fix tm_isdst value usage (allowing + any positive value from user (per std) rather than depending + upon 1). + 2008-08-28 Corinna Vinschen * libc/stdlib/wcsrtombs.c (_wcsrtombs_r): Optimize condition diff --git a/newlib/libc/time/mktime.c b/newlib/libc/time/mktime.c index 0ee055cd0..938513233 100644 --- a/newlib/libc/time/mktime.c +++ b/newlib/libc/time/mktime.c @@ -9,6 +9,8 @@ * the fields of the structure are set to represent the specified calendar * time. Returns the specified calendar time. If the calendar time can not be * represented, returns the value (time_t) -1. + * + * Modifications: Fixed tm_isdst usage - 27 August 2008 Craig Howland. */ /* @@ -157,7 +159,7 @@ mktime (tim_p) { time_t tim = 0; long days = 0; - int year, isdst; + int year, isdst, tm_isdst; __tzinfo_type *tz = __gettzinfo (); /* validate structure */ @@ -202,7 +204,9 @@ mktime (tim_p) /* compute total seconds */ tim += (days * _SEC_IN_DAY); - isdst = tim_p->tm_isdst; + /* Convert user positive into 1 */ + tm_isdst = tim_p->tm_isdst > 0 ? 1 : tim_p->tm_isdst; + isdst = tm_isdst; if (_daylight) { @@ -225,8 +229,10 @@ mktime (tim_p) isdst = (tz->__tznorth ? (tim >= startdst_dst && tim < startstd_std) : (tim >= startdst_dst || tim < startstd_std)); - /* if user committed and was wrong, perform correction */ - if ((isdst ^ tim_p->tm_isdst) == 1) + /* if user committed and was wrong, perform correction, but not + * if the user has given a negative value (which + * asks mktime() to determine if DST is in effect or not) */ + if (tm_isdst >= 0 && (isdst ^ tm_isdst) == 1) { /* we either subtract or add the difference between time zone offsets, depending on which way the user got it