Commit: 49c190bc755413b2e11e1d22c37e9c46a930b9f1
Author: Kévin Dietrich
Date:   Wed May 25 14:46:54 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB49c190bc755413b2e11e1d22c37e9c46a930b9f1

Fix crashes and lookup errors due to a weak (and not so thread safe)
string tokenizer algorithm.

===================================================================

M       source/blender/alembic/intern/abc_object.cc
M       source/blender/alembic/intern/abc_util.cc
M       source/blender/alembic/intern/abc_util.h
M       source/blender/alembic/intern/alembic_capi.cc

===================================================================

diff --git a/source/blender/alembic/intern/abc_object.cc 
b/source/blender/alembic/intern/abc_object.cc
index d7358e9..fca0580 100644
--- a/source/blender/alembic/intern/abc_object.cc
+++ b/source/blender/alembic/intern/abc_object.cc
@@ -313,7 +313,7 @@ AbcObjectReader::AbcObjectReader(const IObject &object, 
ImportSettings &settings
 {
        m_name = object.getFullName();
        std::vector<std::string> parts;
-       split(m_name, "/", parts);
+       split(m_name, '/', parts);
 
        assert(parts.size() >= 2);
 
diff --git a/source/blender/alembic/intern/abc_util.cc 
b/source/blender/alembic/intern/abc_util.cc
index 8dd96cd..3620e93 100644
--- a/source/blender/alembic/intern/abc_util.cc
+++ b/source/blender/alembic/intern/abc_util.cc
@@ -106,19 +106,16 @@ Imath::M44d convert_matrix(float mat[4][4])
        return m;
 }
 
-void split(const std::string &s, const char *delim, std::vector<std::string> 
&v)
+void split(const std::string &s, const char delim, std::vector<std::string> 
&tokens)
 {
-       /* to avoid modifying original string first duplicate the original 
string
-        * and return a char pointer then free the memory */
-       char *dup = strdup(s.c_str());
-       char *token = strtok(dup, delim);
-
-       while (token != NULL) {
-               v.push_back(std::string(token));
-               /* the call is treated as a subsequent calls to strtok: the 
function
-                * continues from where it left in previous invocation */
-               token = strtok(NULL, delim);
-       }
+       tokens.clear();
+
+       std::stringstream ss(s);
+       std::string item;
 
-       free(dup);
+       while (std::getline(ss, item, delim)) {
+               if (!item.empty()) {
+                       tokens.push_back(item);
+               }
+       }
 }
diff --git a/source/blender/alembic/intern/abc_util.h 
b/source/blender/alembic/intern/abc_util.h
index 3d75c6e..4b4b9fa 100644
--- a/source/blender/alembic/intern/abc_util.h
+++ b/source/blender/alembic/intern/abc_util.h
@@ -37,7 +37,7 @@ bool parent_selected(Object *ob);
 
 Imath::M44d convert_matrix(float mat[4][4]);
 
-void split(const std::string &s, const char *delim, std::vector<std::string> 
&v);
+void split(const std::string &s, const char delim, std::vector<std::string> 
&tokens);
 
 template<class TContainer>
 bool begins_with(const TContainer &input, const TContainer &match)
diff --git a/source/blender/alembic/intern/alembic_capi.cc 
b/source/blender/alembic/intern/alembic_capi.cc
index ff02caf..f175cb2 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -148,7 +148,7 @@ static void find_mesh_object(const IObject &object, IObject 
&ret,
        }
 
        std::vector<std::string> tokens;
-       split(name, "/", tokens);
+       split(name, '/', tokens);
 
        IObject tmp = object;
 
@@ -429,7 +429,7 @@ static void create_hierarchy(Main *bmain, Scene *scene, 
AbcObjectReader *root)
        const std::string &full_name = iobjet.getFullName();
 
        std::vector<std::string> parts;
-       split(full_name, "/", parts);
+       split(full_name, '/', parts);
 
        /* object doesn't have any parents, since its path only contain its 
name,
         * and its data name. */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to