diff options
author | Paolo Carlini <pcarlini@unitus.it> | 2002-11-26 02:22:13 +0100 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2002-11-26 01:22:13 +0000 |
commit | b1455c558e80a696200f259871a0ebf16baa2d7d (patch) | |
tree | 7bca89ff40dc3a09433debe2a119abd1c08b0a3f | |
parent | 162c7cd92dae4c0504dd653b948369a3f593ca32 (diff) | |
download | gcc-b1455c558e80a696200f259871a0ebf16baa2d7d.zip gcc-b1455c558e80a696200f259871a0ebf16baa2d7d.tar.gz gcc-b1455c558e80a696200f259871a0ebf16baa2d7d.tar.bz2 |
localename.cc (locale::_Impl::_Impl(const char*, size_t)): Avoid strtok for thread safety.
2002-11-25 Paolo Carlini <pcarlini@unitus.it>
Nathan Myers <ncm@cantrip.org>
* src/localename.cc
(locale::_Impl::_Impl(const char*, size_t)):
Avoid strtok for thread safety.
Co-Authored-By: Nathan Myers <ncm@cantrip.org>
From-SVN: r59486
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/src/localename.cc | 31 |
2 files changed, 23 insertions, 15 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 57c188c..fbf147f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2002-11-25 Paolo Carlini <pcarlini@unitus.it> + Nathan Myers <ncm@cantrip.org> + + * src/localename.cc + (locale::_Impl::_Impl(const char*, size_t)): + Avoid strtok for thread safety. + 2002-11-25 Stephen M. Webb <stephen@bregmasoft.com> * testsuite/testsuite_allocator.h: New file. diff --git a/libstdc++-v3/src/localename.cc b/libstdc++-v3/src/localename.cc index 0a2c521..daed6f1 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<char>(__cloc, 0, false)); _M_init_facet(new codecvt<char, char, mbstate_t>(__cloc)); |