From 8477863e75991703a4c2da9f720bcdef3ea16521 Mon Sep 17 00:00:00 2001
From: Micah Cowan <micah@cowan.name>
Date: Thu, 11 Jun 2009 18:58:26 -0700
Subject: [PATCH] Fix bad setlocale usage.

---
 src/ChangeLog |  4 ++++
 src/http.c    | 14 +++++++++++++-
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index af39497d..6b9ba32d 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -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.
 
diff --git a/src/http.c b/src/http.c
index c3adbf40..27234198 100644
--- a/src/http.c
+++ b/src/http.c
@@ -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;
 }