diff --git a/src/ChangeLog b/src/ChangeLog index 3811d130..c0f6e9b1 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2005-05-05 Hrvoje Niksic + + * http.c (http_atotm): Zero out the whole struct tm being passed + to strptime. + 2005-05-05 Hrvoje Niksic * main.c (main): Propagate option name to setoptval. diff --git a/src/http.c b/src/http.c index 97a773a1..7d27ef73 100644 --- a/src/http.c +++ b/src/http.c @@ -2633,30 +2633,30 @@ http_atotm (const char *time_string) (google.com uses this for their cookies.) */ "%a %b %d %T %Y" /* asctime: Thu Jan 29 22:12:57 1998 */ }; - int i; - struct tm t; - - /* According to Roger Beeman, we need to initialize tm_isdst, since - strptime won't do it. */ - t.tm_isdst = 0; - - /* Note that under foreign locales Solaris strptime() fails to - recognize English dates, which renders this function useless. We - solve this by being careful not to affect LC_TIME when - initializing locale. - - Another solution would be to temporarily set locale to C, invoke - strptime(), and restore it back. This is slow and dirty, - however, and locale support other than LC_MESSAGES can mess other - things, so I rather chose to stick with just setting LC_MESSAGES. - - GNU strptime does not have this problem because it recognizes - both international and local dates. */ for (i = 0; i < countof (time_formats); i++) - if (check_end (strptime (time_string, time_formats[i], &t))) - return mktime_from_utc (&t); + { + struct tm t; + + /* Some versions of strptime use the existing contents of struct + tm to recalculate the date according to format. Zero it out + to prevent garbage from the stack influencing strptime. */ + xzero (t); + + /* Note that under non-English locales Solaris strptime() fails + to recognize English dates, which renders it useless for this + purpose. We solve this by not setting LC_TIME when + initializing locale. Another solution would be to + temporarily set locale to C, invoke strptime(), and restore + it back, but that is somewhat slow and dirty. + + GNU strptime does not have this problem because it recognizes + both international and local dates. */ + + if (check_end (strptime (time_string, time_formats[i], &t))) + return mktime_from_utc (&t); + } /* All formats have failed. */ return -1;