Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2008-08-28 22:18:12 +0400
committerJeff Johnston <jjohnstn@redhat.com>2008-08-28 22:18:12 +0400
commitb6ab3057f6b68c72eddf26282fae8db7cbffe51e (patch)
tree2ecca5ab8a89728965ceea6fe3efdee9531c6aad
parent60ac13a0b0676a6896b116309c93090fc140f23b (diff)
2008-08-28 Craig Howland <howland@LGSInnovations.com>
* libc/time/mktime.c (mktime): Fix tm_isdst value usage (allowing any positive value from user (per std) rather than depending upon 1).
-rw-r--r--newlib/ChangeLog6
-rw-r--r--newlib/libc/time/mktime.c14
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 <howland@LGSInnovations.com>
+
+ * 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 <corinna@vinschen.de>
* 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