]> granicus.if.org Git - curl/commitdiff
Martin Skinner brought back bug report #1230118 to haunt us once again.
authorDaniel Stenberg <daniel@haxx.se>
Tue, 5 Dec 2006 14:57:43 +0000 (14:57 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 5 Dec 2006 14:57:43 +0000 (14:57 +0000)
(http://curl.haxx.se/bug/view.cgi?id=1230118) curl_getdate() did not work
properly for all input dates on Windows. It was mostly seen on some TZ time
zones using DST. Luckily, Martin also provided a fix.

CHANGES
RELEASE-NOTES
lib/parsedate.c

diff --git a/CHANGES b/CHANGES
index 399fca226b06b2054f614c87cd5c94bccf01daf0..55288a34b9294722c8502f73a0da6878cc48d605 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,11 @@
                                   Changelog
 
 Daniel (5 December 2006)
+- Martin Skinner brought back bug report #1230118 to haunt us once again.
+  (http://curl.haxx.se/bug/view.cgi?id=1230118) curl_getdate() did not work
+  properly for all input dates on Windows. It was mostly seen on some TZ time
+  zones using DST. Luckily, Martin also provided a fix.
+
 - Alexey Simak filed bug report #1600447
   (http://curl.haxx.se/bug/view.cgi?id=1600447) in which he noted that active
   FTP connections don't work with the multi interface. The problem is here
index 2db25e372430588065a76d2165762362aafc6887..99ef62c0862e8b73899daf3c0e6cef5fc2ee8761 100644 (file)
@@ -28,6 +28,7 @@ This release includes the following bugfixes:
  o Content-Range: header parsing improved
  o CPU 100% load when HTTP upload connection broke
  o active FTP didn't work with multi interface
+ o curl_getdate() could be off one hour for TZ time zones with DST, on windows
 
 Other curl-related news:
 
@@ -45,6 +46,6 @@ advice from friends like these:
 
  James Housley, Olaf Stueben, Yang Tse, Gisle Vanem, Bradford Bruce,
  Ciprian Badescu, Dmitriy Sergeyev, Nir Soffer, Venkat Akella, Toon Verwaest,
- Matt Witherspoon, Alexey Simak
+ Matt Witherspoon, Alexey Simak, Martin Skinner
 
         Thanks! (and sorry if I forgot to mention someone)
index 0bb6d0c5aa6fac79a67b177f28844bfb8f2a1399..ef91585e5dd359b878b4a9ae95a0658a897dd35b 100644 (file)
@@ -239,18 +239,6 @@ static time_t Curl_parsedate(const char *date)
   const char *indate = date; /* save the original pointer */
   int part = 0; /* max 6 parts */
 
-#ifdef WIN32
-  /*
-   * On Windows, we need an odd work-around for the case when no TZ variable
-   * is set. If it isn't set and "automatic DST adjustment" is enabled, the
-   * time functions below will return values one hour off! As reported and
-   * investigated in bug report #1230118.
-  */
-  const char *env = getenv("TZ");
-  if(!env)
-    putenv("TZ=GMT");
-#endif
-
   while(*date && (part < 6)) {
     bool found=FALSE;
 
@@ -400,13 +388,22 @@ static time_t Curl_parsedate(const char *date)
     /* thread-safe version */
     struct tm keeptime2;
     gmt = (struct tm *)gmtime_r(&t, &keeptime2);
+    if(!gmt)
+      return -1; /* illegal date/time */
+    t2 = mktime(gmt);
 #else
+    /* It seems that at least the MSVC version of mktime() doesn't work
+       properly if it gets the 'gmt' pointer passed in (which is a pointer
+       returned from gmtime() pointing to static memory), so instead we copy
+       the tm struct to a local struct and pass a pointer to that struct as
+       input to mktime(). */
+    struct tm gmt2;
     gmt = gmtime(&t); /* use gmtime_r() if available */
-#endif
     if(!gmt)
       return -1; /* illegal date/time */
-
-    t2 = mktime(gmt);
+    gmt2 = *gmt;
+    t2 = mktime(&gmt2);
+#endif
 
     /* Add the time zone diff (between the given timezone and GMT) and the
        diff between the local time zone and GMT. */