From: Antony Dovgal Date: Thu, 25 Jan 2007 13:37:04 +0000 (+0000) Subject: setlocale() returns static buffer, which must be copied X-Git-Tag: RELEASE_1_2_3~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4cb734b05f74f5f5a92a56e630e1a9f941496f32;p=php setlocale() returns static buffer, which must be copied --- diff --git a/ext/date/lib/parse_tz.c b/ext/date/lib/parse_tz.c index 4f99d22c54..2483961365 100644 --- a/ext/date/lib/parse_tz.c +++ b/ext/date/lib/parse_tz.c @@ -196,7 +196,13 @@ void timelib_dump_tzinfo(timelib_tzinfo *tz) static int seek_to_tz_position(const unsigned char **tzf, char *timezone, const timelib_tzdb *tzdb) { int left = 0, right = tzdb->index_size - 1; - char *cur_locale = setlocale(LC_CTYPE, "C"); + char *cur_locale = NULL, *tmp; + + tmp = setlocale(LC_CTYPE, NULL); + if (tmp) { + cur_locale = strdup(tmp); + } + setlocale(LC_CTYPE, "C"); do { int mid = ((unsigned)left + right) >> 1; @@ -209,12 +215,14 @@ static int seek_to_tz_position(const unsigned char **tzf, char *timezone, const } else { /* (cmp == 0) */ (*tzf) = &(tzdb->data[tzdb->index[mid].pos + 20]); setlocale(LC_CTYPE, cur_locale); + if (cur_locale) free(cur_locale); return 1; } } while (left <= right); setlocale(LC_CTYPE, cur_locale); + if (cur_locale) free(cur_locale); return 0; }