From: Paolo Carlini Date: Tue, 26 Nov 2002 01:22:13 +0000 (+0100) Subject: localename.cc (locale::_Impl::_Impl(const char*, size_t)): Avoid strtok for thread... X-Git-Tag: releases/gcc-3.3.0~1633 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b1455c558e80a696200f259871a0ebf16baa2d7d;p=thirdparty%2Fgcc.git localename.cc (locale::_Impl::_Impl(const char*, size_t)): Avoid strtok for thread safety. 2002-11-25 Paolo Carlini Nathan Myers * src/localename.cc (locale::_Impl::_Impl(const char*, size_t)): Avoid strtok for thread safety. Co-Authored-By: Nathan Myers From-SVN: r59486 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 57c188c56f25..fbf147f5a8c7 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2002-11-25 Paolo Carlini + Nathan Myers + + * src/localename.cc + (locale::_Impl::_Impl(const char*, size_t)): + Avoid strtok for thread safety. + 2002-11-25 Stephen M. Webb * testsuite/testsuite_allocator.h: New file. diff --git a/libstdc++-v3/src/localename.cc b/libstdc++-v3/src/localename.cc index 0a2c5210215f..daed6f1f2032 100644 --- a/libstdc++-v3/src/localename.cc +++ b/libstdc++-v3/src/localename.cc @@ -141,9 +141,9 @@ namespace std } // Name all the categories. + size_t __len = strlen(__s) + 1; if (!strchr(__s, ';')) { - size_t __len = strlen(__s) + 1; for (size_t __i = 0; __i < _S_categories_size + _S_extra_categories_size; ++__i) { @@ -152,27 +152,28 @@ namespace std } } else - { - char* __tmp = strdup(__s); - __tmp[strlen(__tmp)] = ';'; - strtok(__tmp, "=;"); + { + char* __new; + const char* __save = __s; + char* __next = strpbrk(__save, "=;"); + __save = __next + 1; for (size_t __i = 0; __i < _S_categories_size + _S_extra_categories_size - 1; ++__i) { - char* __src = strtok(NULL, "=;"); - char* __new = new char[strlen(__src) + 1]; - strcpy(__new, __src); + __next = strpbrk(__save, "=;"); + __new = new char[__next - __save + 1]; + memcpy(__new, __save, __next - __save); + __new[__next - __save] = '\0'; _M_names[__i] = __new; - strtok(NULL, "=;"); + __save = __next + 1; + __next = strpbrk(__save, "=;"); + __save = __next + 1; } - char* __src = strtok(NULL, "=;"); - char* __new = new char[strlen(__src) + 1]; - strcpy(__new, __src); + __new = new char[__s + __len - __save]; + memcpy(__new, __save, __s + __len - __save); _M_names[_S_categories_size + _S_extra_categories_size - 1] = __new; - - free(__tmp); } - + // Construct all standard facets and add them to _M_facets. _M_init_facet(new std::ctype(__cloc, 0, false)); _M_init_facet(new codecvt(__cloc));