]> sjero.net Git - wget/commitdiff
[svn] Zero out all of struct tm before passing it to strptime.
authorhniksic <devnull@localhost>
Thu, 5 May 2005 21:49:28 +0000 (14:49 -0700)
committerhniksic <devnull@localhost>
Thu, 5 May 2005 21:49:28 +0000 (14:49 -0700)
src/ChangeLog
src/http.c

index 3811d130e48926844e44ff8b64e8e77fed8688da..c0f6e9b1e24e080a504d474c58ac2a66e08e5525 100644 (file)
@@ -1,3 +1,8 @@
+2005-05-05  Hrvoje Niksic  <hniksic@xemacs.org>
+
+       * http.c (http_atotm): Zero out the whole struct tm being passed
+       to strptime.
+
 2005-05-05  Hrvoje Niksic  <hniksic@xemacs.org>
 
        * main.c (main): Propagate option name to setoptval.
index 97a773a1e2d720abe45ac5041c3245e0477d49a7..7d27ef7368bc7583cf5c3eeaca1b7f44aa042787 100644 (file)
@@ -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;
+  for (i = 0; i < countof (time_formats); i++)
+    {
+      struct tm t;
 
-  /* 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.
+      /* 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);
 
-     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.
+      /* 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.  */
+        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);
+      if (check_end (strptime (time_string, time_formats[i], &t)))
+       return mktime_from_utc (&t);
+    }
 
   /* All formats have failed.  */
   return -1;