]> sjero.net Git - wget/commitdiff
Fix bad setlocale usage.
authorMicah Cowan <micah@cowan.name>
Fri, 12 Jun 2009 01:58:26 +0000 (18:58 -0700)
committerMicah Cowan <micah@cowan.name>
Fri, 12 Jun 2009 01:58:26 +0000 (18:58 -0700)
src/ChangeLog
src/http.c

index af39497d5830dbc718fc3d99a80e37b645ff2262..6b9ba32d77e4956e68f03b25ecab3461f1f34b59 100644 (file)
@@ -1,5 +1,9 @@
 2009-06-11  Micah Cowan  <micah@cowan.name>
 
+       * http.c (http_atotm): Handle potential for setlocale's return
+       value to be static storage. Thanks to Benjamin Wolsey
+       <bwy@benjaminwolsey.de>.
+
        * sysdep.h: Need NAMESPACE_TWEAKS on non-Linux glibc-based
        systems, too. Thanks to Robert Millan.
 
index c3adbf40755150d2ab158f674941302b8dd521cb..27234198779b7a0b1a44adb99182841bb7c493f6 100644 (file)
@@ -2935,6 +2935,7 @@ http_atotm (const char *time_string)
                                    Netscape cookie specification.) */
   };
   const char *oldlocale;
+  char savedlocale[256];
   size_t i;
   time_t ret = (time_t) -1;
 
@@ -2942,6 +2943,16 @@ http_atotm (const char *time_string)
      non-English locales, which we work around by temporarily setting
      locale to C before invoking strptime.  */
   oldlocale = setlocale (LC_TIME, NULL);
+  if (oldlocale)
+    {
+      size_t l = strlen (oldlocale);
+      if (l >= sizeof savedlocale)
+        savedlocale[0] = '\0';
+      else
+        memcpy (savedlocale, oldlocale, l);
+    }
+  else savedlocale[0] = '\0';
+
   setlocale (LC_TIME, "C");
 
   for (i = 0; i < countof (time_formats); i++)
@@ -2961,7 +2972,8 @@ http_atotm (const char *time_string)
     }
 
   /* Restore the previous locale. */
-  setlocale (LC_TIME, oldlocale);
+  if (savedlocale[0])
+    setlocale (LC_TIME, savedlocale);
 
   return ret;
 }