]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libstdc++/8790 (Use of non thread-safe strtok in src/localename.cc)
authorPaolo Carlini <pcarlini@unitus.it>
Thu, 5 Dec 2002 13:04:43 +0000 (14:04 +0100)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 5 Dec 2002 13:04:43 +0000 (13:04 +0000)
2002-12-05  Paolo Carlini  <pcarlini@unitus.it>
    Nathan Myers  <ncm@cantrip.org>

PR libstdc++/8790
* 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: r59856

libstdc++-v3/ChangeLog
libstdc++-v3/src/localename.cc

index 4476f5b1e4b137097de8435c930d15425bb72402..bac4c721a11b1109ff9d46f4b063f010cea7712b 100644 (file)
@@ -1,3 +1,11 @@
+2002-12-05  Paolo Carlini  <pcarlini@unitus.it>
+            Nathan Myers  <ncm@cantrip.org>
+
+       PR libstdc++/8790
+       * src/localename.cc
+       (locale::_Impl::_Impl(const char*, size_t)):
+       Avoid strtok for thread safety.
+
 2002-12-04  Loren J. Rittle  <ljrittle@acm.org>
 
        PR libstdc++/7445
index 61aa952e6ad2e7277c242317588f41bb899fda92..dff76d459072936b782e84b8d1e2601c671aa7d6 100644 (file)
@@ -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.