From 8477863e75991703a4c2da9f720bcdef3ea16521 Mon Sep 17 00:00:00 2001 From: Micah Cowan 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 + * http.c (http_atotm): Handle potential for setlocale's return + value to be static storage. Thanks to Benjamin Wolsey + . + * 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; }