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.
This commit is contained in:
Daniel Stenberg 2006-12-05 14:57:43 +00:00
parent 3c4f622479
commit 17ae28e0fe
3 changed files with 20 additions and 17 deletions

View File

@ -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

View 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)

View 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);
#else
gmt = gmtime(&t); /* use gmtime_r() if available */
#endif
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 */
if(!gmt)
return -1; /* illegal date/time */
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. */