From 28ced40c7ddd248b5d64b7b5272fb17b6e97b13a Mon Sep 17 00:00:00 2001 From: John Darrington Date: Sun, 22 Mar 2009 13:19:12 +0900 Subject: [PATCH] Avoid potential bugs with setlocale's return value. Use strdup to copy all return values from setlocale, since it's statically allocated. --- src/libpspp/i18n.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/libpspp/i18n.c b/src/libpspp/i18n.c index 1028d0be..f8e5e396 100644 --- a/src/libpspp/i18n.c +++ b/src/libpspp/i18n.c @@ -35,8 +35,8 @@ #endif -static char *locale = 0; -static const char *charset; +static char *locale; +static char *charset; static iconv_t convertor[n_CONV]; @@ -165,16 +165,17 @@ void set_pspp_locale (const char *l) { char *current_locale; - const char *current_charset; + char *current_charset; free(locale); locale = strdup(l); - current_locale = setlocale (LC_CTYPE, 0); - current_charset = locale_charset (); + current_locale = strdup (setlocale (LC_CTYPE, 0)); + current_charset = strdup (locale_charset ()); setlocale (LC_CTYPE, locale); - charset = locale_charset (); + free (charset); + charset = strdup (locale_charset ()); setlocale (LC_CTYPE, current_locale); iconv_close (convertor[CONV_PSPP_TO_UTF8]); @@ -185,6 +186,9 @@ set_pspp_locale (const char *l) iconv_close (convertor[CONV_UTF8_TO_PSPP]); convertor[CONV_UTF8_TO_PSPP] = create_iconv (charset, "UTF-8"); + + free (current_locale); + free (current_charset); } void @@ -194,7 +198,9 @@ i18n_init (void) locale = strdup (setlocale (LC_CTYPE, NULL)); setlocale (LC_CTYPE, locale); - charset = locale_charset (); + + free (charset); + charset = strdup (locale_charset ()); convertor[CONV_PSPP_TO_UTF8] = create_iconv ("UTF-8", charset); convertor[CONV_SYSTEM_TO_PSPP] = create_iconv (charset, charset); -- 2.30.2