From: Paolo Carlini Date: Thu, 5 Dec 2002 13:04:43 +0000 (+0100) Subject: re PR libstdc++/8790 (Use of non thread-safe strtok in src/localename.cc) X-Git-Tag: releases/gcc-3.2.2~211 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=38b614ef4896925202c5b026897f85faca4c3e5e;p=thirdparty%2Fgcc.git re PR libstdc++/8790 (Use of non thread-safe strtok in src/localename.cc) 2002-12-05 Paolo Carlini Nathan Myers PR libstdc++/8790 * src/localename.cc (locale::_Impl::_Impl(const char*, size_t)): Avoid strtok for thread safety. Co-Authored-By: Nathan Myers From-SVN: r59856 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 4476f5b1e4b1..bac4c721a11b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2002-12-05 Paolo Carlini + Nathan Myers + + PR libstdc++/8790 + * src/localename.cc + (locale::_Impl::_Impl(const char*, size_t)): + Avoid strtok for thread safety. + 2002-12-04 Loren J. Rittle PR libstdc++/7445 diff --git a/libstdc++-v3/src/localename.cc b/libstdc++-v3/src/localename.cc index 61aa952e6ad2..dff76d459072 100644 --- a/libstdc++-v3/src/localename.cc +++ b/libstdc++-v3/src/localename.cc @@ -141,36 +141,31 @@ namespace std } // Name all the categories. + size_t __len = strlen(__s); if (!strchr(__s, ';')) { - size_t __len = strlen(__s) + 1; for (size_t __i = 0; __i < _S_categories_size + _S_extra_categories_size; ++__i) { - _M_names[__i] = new char[__len]; + _M_names[__i] = new char[__len + 1]; strcpy(_M_names[__i], __s); } } else { - char* __tmp = strdup(__s); - __tmp[strlen(__tmp)] = ';'; - strtok(__tmp, "=;"); + const char* __beg = __s; for (size_t __i = 0; - __i < _S_categories_size + _S_extra_categories_size - 1; ++__i) + __i < _S_categories_size + _S_extra_categories_size; ++__i) { - char* __src = strtok(NULL, "=;"); - char* __new = new char[strlen(__src) + 1]; - strcpy(__new, __src); + __beg = strchr(__beg, '=') + 1; + const char* __end = strchr(__beg, ';'); + if (!__end) + __end = __s + __len; + char* __new = new char[__end - __beg + 1]; + memcpy(__new, __beg, __end - __beg); + __new[__end - __beg] = '\0'; _M_names[__i] = __new; - strtok(NULL, "=;"); } - char* __src = strtok(NULL, "=;"); - char* __new = new char[strlen(__src) + 1]; - strcpy(__new, __src); - _M_names[_S_categories_size + _S_extra_categories_size - 1] = __new; - - free(__tmp); } // Construct all standard facets and add them to _M_facets.