瀏覽代碼

OFFLoader: Use a temporary vector to store vertices instead of a raw array

Prevents crash on certain malformed inputs but
they still cause a validation failure.
Turo Lamminen 10 年之前
父節點
當前提交
7a5bc6eca3
共有 1 個文件被更改,包括 5 次插入3 次删除
  1. 5 3
      code/OFFLoader.cpp

+ 5 - 3
code/OFFLoader.cpp

@@ -192,8 +192,8 @@ void OFFImporter::InternReadFile( const std::string& pFile,
         throw DeadlyImportError("OFF: There are no valid faces");
         throw DeadlyImportError("OFF: There are no valid faces");
 
 
     // allocate storage for the output vertices
     // allocate storage for the output vertices
-    aiVector3D* verts = new aiVector3D[mesh->mNumVertices];
-    mesh->mVertices = verts;
+    std::vector<aiVector3D> verts;
+    verts.reserve(mesh->mNumVertices);
 
 
     // second: now parse all face indices
     // second: now parse all face indices
     buffer = old;
     buffer = old;
@@ -219,12 +219,14 @@ void OFFImporter::InternReadFile( const std::string& pFile,
                 idx = numVertices-1;
                 idx = numVertices-1;
             }
             }
             faces->mIndices[m] = p++;
             faces->mIndices[m] = p++;
-            *verts++ = tempPositions[idx];
+            verts.push_back(tempPositions[idx]);
         }
         }
         ++i;
         ++i;
         ++faces;
         ++faces;
     }
     }
 
 
+    mesh->mVertices = new aiVector3D[verts.size()];
+    memcpy(mesh->mVertices, &verts[0], verts.size() * sizeof(aiVector3D));
     // generate the output node graph
     // generate the output node graph
     pScene->mRootNode = new aiNode();
     pScene->mRootNode = new aiNode();
     pScene->mRootNode->mName.Set("<OFFRoot>");
     pScene->mRootNode->mName.Set("<OFFRoot>");