Commit: b3fbc7f1915195c61c36cfcdd7c2419c14d52fa7
Author: Hugo Sales
Date:   Sun Jul 21 19:46:58 2019 +0100
Branches: soc-2019-fast-io
https://developer.blender.org/rBb3fbc7f1915195c61c36cfcdd7c2419c14d52fa7

[Fast import/export] Fixed segfault on some files

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

M       source/blender/editors/io/intern/obj_import.cpp

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

diff --git a/source/blender/editors/io/intern/obj_import.cpp 
b/source/blender/editors/io/intern/obj_import.cpp
index f8836f6bd09..90a10eaae2e 100644
--- a/source/blender/editors/io/intern/obj_import.cpp
+++ b/source/blender/editors/io/intern/obj_import.cpp
@@ -69,19 +69,15 @@ extern "C" {
 #include "common.hpp"
 #include "iterators.hpp"
 
-// struct float3 {
-//   float x, y, z;
-// };
-// BOOST_FUSION_ADAPT_STRUCT(float3, (float, x)(float, y)(float, z))
-
 BOOST_FUSION_DEFINE_STRUCT((), obj_face, (int, vx)(int, uv)(int, no))
 BOOST_FUSION_DEFINE_STRUCT((), float3, (float, x)(float, y)(float, z))
 BOOST_FUSION_DEFINE_STRUCT((), float2, (float, u)(float, v))
 
 namespace {
 
-namespace qi = boost::spirit::qi;
 namespace ph = boost::phoenix;
+
+namespace qi = boost::spirit::qi;
 template<typename Result> using rule = qi::rule<const char *, Result>;
 
 template<typename Inner> using vec = std::vector<Inner>;
@@ -147,18 +143,21 @@ void OBJ_import_start(bContext *C, ImportSettings *const 
settings)
   OBJImport import{settings};
 
   boost::iostreams::mapped_file mmap(settings->filepath, 
boost::iostreams::mapped_file::readonly);
-  const char *const start = mmap.const_data();
-  const char *const last = start + mmap.size() - 1;
-  const char *first = start;
+  const char *const begin = mmap.const_data();
+  const char *const end = begin + mmap.size() - 1;
+  const char *curr = begin;
 
   /* clang-format off */
 
+  using ign = qi::unused_type;
+
   // Components
-  auto           token         = qi::lexeme[+(qi::graph)];
-  auto           rest          = qi::omit[*(qi::char_ - qi::eol)] >> qi::eol;
-  auto           comment       = qi::lit("#") >> rest;
-  rule<float3()> rule3f        = qi::float_ >> qi::float_ >> qi::float_;
-  rule<float2()> rule2f        = qi::float_ >> qi::float_;
+  rule<ign()>    rest          = *qi::omit[qi::char_ - qi::eol];
+  rule<ign()>    comment       = '#' >> rest;
+  rule<str()>    token         = qi::lexeme[+(qi::graph)];
+  rule<float()>  rulef         = qi::float_ | qi::as<float>()[qi::int_];
+  rule<float2()> rule2f        = rulef >> rulef;
+  rule<float3()> rule3f        = qi::float_ >> qi::float_ >> qi::float_; 
//rulef >> rulef >> rulef;
   rule<obj_face> rule_obj_face = qi::int_ >> -('/' >> -qi::int_) >> -('/' >> 
qi::int_);
   rule<int()>    on_off        = qi::lit("off")[qi::_val = 0] |
                                  qi::lit("on")[qi::_val = 1] |
@@ -193,8 +192,9 @@ void OBJ_import_start(bContext *C, ImportSettings *const 
settings)
 #undef BIND
   /* clang-format on */
 
-  if (!result || first != last) {
-    std::cerr << "Couldn't parse near: " << first;
+  if (!result || curr != end) {
+    std::cerr << "Couldn't parse near: " << curr;
+    return;
   }
 
   if (import.meshes.size() >= 2) {

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

Reply via email to