Browse Source

Merge branch 'master' of https://github.com/assimp/assimp

Kim Kulling 9 years ago
parent
commit
566aa1ae00

+ 10 - 0
.travis.yml

@@ -1,5 +1,6 @@
 before_install:
 before_install:
   - sudo apt-get update -qq
   - sudo apt-get update -qq
+  - sudo apt-get install cmake
   - sudo apt-get install cmake python3
   - sudo apt-get install cmake python3
   - if [ $LINUX ]; then sudo apt-get install -qq freeglut3-dev libxmu-dev libxi-dev ; fi
   - if [ $LINUX ]; then sudo apt-get install -qq freeglut3-dev libxmu-dev libxi-dev ; fi
   - echo -e "#ifndef A_R_H_INC\n#define A_R_H_INC\n#define GitVersion ${TRAVIS_JOB_ID}\n#define GitBranch \"${TRAVIS_BRANCH}\"\n#endif // A_R_H_INC" > revision.h
   - echo -e "#ifndef A_R_H_INC\n#define A_R_H_INC\n#define GitVersion ${TRAVIS_JOB_ID}\n#define GitBranch \"${TRAVIS_BRANCH}\"\n#endif // A_R_H_INC" > revision.h
@@ -18,6 +19,7 @@ branches:
 
 
 env:
 env:
   global:
   global:
+    - secure: "lZ7pHQvl5dpZWzBQAaIMf0wqrvtcZ4wiZKeIZjf83TEsflW8+z0uTpIuN30ZV6Glth/Sq1OhLnTP5+N57fZU/1ebA5twHdvP4bS5CIUUg71/CXQZNl36xeaqvxsG/xRrdpKOsPdjAOsQ9KPTQulsX43XDLS7CasMiLvYOpqKcPc="
     - PV=r8e PLATF=linux-x86_64 NDK_HOME=${TRAVIS_BUILD_DIR}/android-ndk-${PV} PATH=${PATH}:${NDK_HOME}
     - PV=r8e PLATF=linux-x86_64 NDK_HOME=${TRAVIS_BUILD_DIR}/android-ndk-${PV} PATH=${PATH}:${NDK_HOME}
   matrix:
   matrix:
     - LINUX=1 TRAVIS_NO_EXPORT=YES ENABLE_COVERALLS=ON
     - LINUX=1 TRAVIS_NO_EXPORT=YES ENABLE_COVERALLS=ON
@@ -52,3 +54,11 @@ after_success:
   - lcov --list coverage.info
   - lcov --list coverage.info
   - coveralls-lcov --source-encoding=ISO-8859-1 --repo-token=${COVERALLS_TOKEN} coverage.info
   - coveralls-lcov --source-encoding=ISO-8859-1 --repo-token=${COVERALLS_TOKEN} coverage.info
 
 
+addons:
+  coverity_scan:
+    project:
+      name: "assimp/assimp"
+    notification_email: [email protected]
+    build_command_prepend: "cmake"
+    build_command: "make"
+    branch_pattern: coverity_scan

+ 1 - 0
appveyor.yml

@@ -40,3 +40,4 @@ after_build:
 artifacts:
 artifacts:
   - path: assimp.7z
   - path: assimp.7z
     name: assimp_lib
     name: assimp_lib
+

+ 10 - 8
code/BlenderLoader.cpp

@@ -105,6 +105,8 @@ BlenderImporter::~BlenderImporter()
     delete modifier_cache;
     delete modifier_cache;
 }
 }
 
 
+static const char* Tokens[] = { "BLENDER" };
+
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 // Returns whether the class can handle the format of the given file.
 // Returns whether the class can handle the format of the given file.
 bool BlenderImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const
 bool BlenderImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const
@@ -116,8 +118,7 @@ bool BlenderImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, b
 
 
     else if ((!extension.length() || checkSig) && pIOHandler)   {
     else if ((!extension.length() || checkSig) && pIOHandler)   {
         // note: this won't catch compressed files
         // note: this won't catch compressed files
-        const char* tokens[] = {"BLENDER"};
-        return SearchFileHeaderForToken(pIOHandler,pFile,tokens,1);
+        return SearchFileHeaderForToken(pIOHandler,pFile, Tokens,1);
     }
     }
     return false;
     return false;
 }
 }
@@ -171,7 +172,7 @@ void BlenderImporter::InternReadFile( const std::string& pFile,
 
 
     char magic[8] = {0};
     char magic[8] = {0};
     stream->Read(magic,7,1);
     stream->Read(magic,7,1);
-    if (strcmp(magic,"BLENDER")) {
+    if (strcmp(magic, Tokens[0] )) {
         // Check for presence of the gzip header. If yes, assume it is a
         // Check for presence of the gzip header. If yes, assume it is a
         // compressed blend file and try uncompressing it, else fail. This is to
         // compressed blend file and try uncompressing it, else fail. This is to
         // avoid uncompressing random files which our loader might end up with.
         // avoid uncompressing random files which our loader might end up with.
@@ -346,8 +347,9 @@ void BlenderImporter::ConvertBlendFile(aiScene* out, const Scene& in,const FileD
         if (cur->object) {
         if (cur->object) {
             if(!cur->object->parent) {
             if(!cur->object->parent) {
                 no_parents.push_back(cur->object.get());
                 no_parents.push_back(cur->object.get());
+            } else {
+                conv.objects.insert( cur->object.get() );
             }
             }
-            else conv.objects.insert(cur->object.get());
         }
         }
     }
     }
     for (std::shared_ptr<Base> cur = in.basact; cur; cur = cur->next) {
     for (std::shared_ptr<Base> cur = in.basact; cur; cur = cur->next) {
@@ -430,8 +432,9 @@ void BlenderImporter::ResolveImage(aiMaterial* out, const Material* mat, const M
         // so we can extract the file extension from it.
         // so we can extract the file extension from it.
         const size_t nlen = strlen( img->name );
         const size_t nlen = strlen( img->name );
         const char* s = img->name+nlen, *e = s;
         const char* s = img->name+nlen, *e = s;
-
-        while (s >= img->name && *s != '.')--s;
+        while ( s >= img->name && *s != '.' ) {
+            --s;
+        }
 
 
         tex->achFormatHint[0] = s+1>e ? '\0' : ::tolower( s[1] );
         tex->achFormatHint[0] = s+1>e ? '\0' : ::tolower( s[1] );
         tex->achFormatHint[1] = s+2>e ? '\0' : ::tolower( s[2] );
         tex->achFormatHint[1] = s+2>e ? '\0' : ::tolower( s[2] );
@@ -448,8 +451,7 @@ void BlenderImporter::ResolveImage(aiMaterial* out, const Material* mat, const M
         tex->pcData = reinterpret_cast<aiTexel*>(ch);
         tex->pcData = reinterpret_cast<aiTexel*>(ch);
 
 
         LogInfo("Reading embedded texture, original file was "+std::string(img->name));
         LogInfo("Reading embedded texture, original file was "+std::string(img->name));
-    }
-    else {
+    } else {
         name = aiString( img->name );
         name = aiString( img->name );
     }
     }
 
 

+ 1 - 1
code/BlenderScene.cpp

@@ -805,5 +805,5 @@ void DNA::RegisterConverters() {
     converters["Image"] = DNA::FactoryPair( &Structure::Allocate<Image>, &Structure::Convert<Image> );
     converters["Image"] = DNA::FactoryPair( &Structure::Allocate<Image>, &Structure::Convert<Image> );
 }
 }
 
 
-
 #endif // ASSIMP_BUILD_NO_BLEND_IMPORTER
 #endif // ASSIMP_BUILD_NO_BLEND_IMPORTER
+

+ 1 - 1
code/FBXConverter.cpp

@@ -1394,9 +1394,9 @@ unsigned int Converter::ConvertMeshMultiMaterial( const MeshGeometry& mesh, cons
     // allocate tangents, binormals.
     // allocate tangents, binormals.
     const std::vector<aiVector3D>& tangents = mesh.GetTangents();
     const std::vector<aiVector3D>& tangents = mesh.GetTangents();
     const std::vector<aiVector3D>* binormals = &mesh.GetBinormals();
     const std::vector<aiVector3D>* binormals = &mesh.GetBinormals();
+    std::vector<aiVector3D> tempBinormals;
 
 
     if ( tangents.size() ) {
     if ( tangents.size() ) {
-        std::vector<aiVector3D> tempBinormals;
         if ( !binormals->size() ) {
         if ( !binormals->size() ) {
             if ( normals.size() ) {
             if ( normals.size() ) {
                 // XXX this computes the binormals for the entire mesh, not only
                 // XXX this computes the binormals for the entire mesh, not only

+ 8 - 5
code/HMPLoader.cpp

@@ -127,8 +127,7 @@ void HMPImporter::InternReadFile( const std::string& pFile,
         throw DeadlyImportError( "HMP File is too small.");
         throw DeadlyImportError( "HMP File is too small.");
 
 
     // Allocate storage and copy the contents of the file to a memory buffer
     // Allocate storage and copy the contents of the file to a memory buffer
-    std::vector<uint8_t> buffer(fileSize);
-    mBuffer = &buffer[0];
+    mBuffer = new uint8_t[fileSize];
     file->Read( (void*)mBuffer, 1, fileSize);
     file->Read( (void*)mBuffer, 1, fileSize);
     iFileSize = (unsigned int)fileSize;
     iFileSize = (unsigned int)fileSize;
 
 
@@ -174,7 +173,9 @@ void HMPImporter::InternReadFile( const std::string& pFile,
     // Set the AI_SCENE_FLAGS_TERRAIN bit
     // Set the AI_SCENE_FLAGS_TERRAIN bit
     pScene->mFlags |= AI_SCENE_FLAGS_TERRAIN;
     pScene->mFlags |= AI_SCENE_FLAGS_TERRAIN;
 
 
-    // File buffer destructs automatically now
+    delete[] mBuffer;
+    mBuffer= nullptr;
+
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
@@ -449,11 +450,13 @@ void HMPImporter::ReadFirstSkin(unsigned int iNumSkins, const unsigned char* szC
 
 
     // read the type of the skin ...
     // read the type of the skin ...
     // sometimes we need to skip 12 bytes here, I don't know why ...
     // sometimes we need to skip 12 bytes here, I don't know why ...
-    uint32_t iType = *((uint32_t*)szCursor);szCursor += sizeof(uint32_t);
+    uint32_t iType = *((uint32_t*)szCursor);
+    szCursor += sizeof(uint32_t);
     if (0 == iType)
     if (0 == iType)
     {
     {
         szCursor += sizeof(uint32_t) * 2;
         szCursor += sizeof(uint32_t) * 2;
-        iType = *((uint32_t*)szCursor);szCursor += sizeof(uint32_t);
+        iType = *((uint32_t*)szCursor);
+        szCursor += sizeof(uint32_t);
         if (!iType)
         if (!iType)
             throw DeadlyImportError("Unable to read HMP7 skin chunk");
             throw DeadlyImportError("Unable to read HMP7 skin chunk");
 
 

+ 3 - 2
code/IRRLoader.cpp

@@ -269,14 +269,15 @@ void IRRImporter::CopyMaterial(std::vector<aiMaterial*>& materials,
         if (UINT_MAX == defMatIdx)
         if (UINT_MAX == defMatIdx)
         {
         {
             defMatIdx = (unsigned int)materials.size();
             defMatIdx = (unsigned int)materials.size();
-            aiMaterial* mat = new aiMaterial();
+            //TODO: add this materials to someone?
+            /*aiMaterial* mat = new aiMaterial();
 
 
             aiString s;
             aiString s;
             s.Set(AI_DEFAULT_MATERIAL_NAME);
             s.Set(AI_DEFAULT_MATERIAL_NAME);
             mat->AddProperty(&s,AI_MATKEY_NAME);
             mat->AddProperty(&s,AI_MATKEY_NAME);
 
 
             aiColor3D c(0.6f,0.6f,0.6f);
             aiColor3D c(0.6f,0.6f,0.6f);
-            mat->AddProperty(&c,1,AI_MATKEY_COLOR_DIFFUSE);
+            mat->AddProperty(&c,1,AI_MATKEY_COLOR_DIFFUSE);*/
         }
         }
         mesh->mMaterialIndex = defMatIdx;
         mesh->mMaterialIndex = defMatIdx;
         return;
         return;

+ 25 - 21
code/IRRMeshLoader.cpp

@@ -116,14 +116,18 @@ const aiImporterDesc* IRRMeshImporter::GetInfo () const
     return &desc;
     return &desc;
 }
 }
 
 
-static void releaseMaterial( aiMaterial *mat ) {
-    delete mat;
-    mat = nullptr;
+static void releaseMaterial( aiMaterial **mat ) {
+    if(*mat!= nullptr) {
+        delete *mat;
+        *mat = nullptr;
+    }
 }
 }
 
 
-static void releaseMesh( aiMesh *mesh ) {
-    delete mesh;
-    mesh = nullptr;
+static void releaseMesh( aiMesh **mesh ) {
+    if (*mesh != nullptr){
+        delete *mesh;
+        *mesh = nullptr;
+    }
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
@@ -148,8 +152,8 @@ void IRRMeshImporter::InternReadFile( const std::string& pFile,
     meshes.reserve(5);
     meshes.reserve(5);
 
 
     // temporary data - current mesh buffer
     // temporary data - current mesh buffer
-    aiMaterial* curMat  = NULL;
-    aiMesh* curMesh     = NULL;
+    aiMaterial* curMat  = nullptr;
+    aiMesh* curMesh     = nullptr;
     unsigned int curMatFlags = 0;
     unsigned int curMatFlags = 0;
 
 
     std::vector<aiVector3D> curVertices,curNormals,curTangents,curBitangents;
     std::vector<aiVector3D> curVertices,curNormals,curTangents,curBitangents;
@@ -170,14 +174,14 @@ void IRRMeshImporter::InternReadFile( const std::string& pFile,
                 // end of previous buffer. A material and a mesh should be there
                 // end of previous buffer. A material and a mesh should be there
                 if ( !curMat || !curMesh)   {
                 if ( !curMat || !curMesh)   {
                     DefaultLogger::get()->error("IRRMESH: A buffer must contain a mesh and a material");                    
                     DefaultLogger::get()->error("IRRMESH: A buffer must contain a mesh and a material");                    
-                    releaseMaterial( curMat );
-                    releaseMesh( curMesh );
+                    releaseMaterial( &curMat );
+                    releaseMesh( &curMesh );
                 } else {
                 } else {
                     materials.push_back(curMat);
                     materials.push_back(curMat);
                     meshes.push_back(curMesh);
                     meshes.push_back(curMesh);
                 }
                 }
-                curMat  = NULL;
-                curMesh = NULL;
+                curMat  = nullptr;
+                curMesh = nullptr;
 
 
                 curVertices.clear();
                 curVertices.clear();
                 curColors.clear();
                 curColors.clear();
@@ -192,7 +196,7 @@ void IRRMeshImporter::InternReadFile( const std::string& pFile,
             if (!ASSIMP_stricmp(reader->getNodeName(),"material"))  {
             if (!ASSIMP_stricmp(reader->getNodeName(),"material"))  {
                 if (curMat) {
                 if (curMat) {
                     DefaultLogger::get()->warn("IRRMESH: Only one material description per buffer, please");
                     DefaultLogger::get()->warn("IRRMESH: Only one material description per buffer, please");
-                    releaseMaterial( curMat );
+                    releaseMaterial( &curMat );
                 }
                 }
                 curMat = ParseMaterial(curMatFlags);
                 curMat = ParseMaterial(curMatFlags);
             }
             }
@@ -204,8 +208,8 @@ void IRRMeshImporter::InternReadFile( const std::string& pFile,
                     // This is possible ... remove the mesh from the list and skip further reading
                     // This is possible ... remove the mesh from the list and skip further reading
                     DefaultLogger::get()->warn("IRRMESH: Found mesh with zero vertices");
                     DefaultLogger::get()->warn("IRRMESH: Found mesh with zero vertices");
 
 
-                    releaseMaterial( curMat );
-                    releaseMesh( curMesh );
+                    releaseMaterial( &curMat );
+                    releaseMesh( &curMesh );
                     textMeaning = 0;
                     textMeaning = 0;
                     continue;
                     continue;
                 }
                 }
@@ -248,7 +252,7 @@ void IRRMeshImporter::InternReadFile( const std::string& pFile,
                     vertexFormat = 2;
                     vertexFormat = 2;
                 }
                 }
                 else if (ASSIMP_stricmp("standard", t)) {
                 else if (ASSIMP_stricmp("standard", t)) {
-                    releaseMaterial( curMat );
+                    releaseMaterial( &curMat );
                     DefaultLogger::get()->warn("IRRMESH: Unknown vertex format");
                     DefaultLogger::get()->warn("IRRMESH: Unknown vertex format");
                 }
                 }
                 else vertexFormat = 0;
                 else vertexFormat = 0;
@@ -256,7 +260,7 @@ void IRRMeshImporter::InternReadFile( const std::string& pFile,
             }
             }
             else if (!ASSIMP_stricmp(reader->getNodeName(),"indices"))  {
             else if (!ASSIMP_stricmp(reader->getNodeName(),"indices"))  {
                 if (curVertices.empty() && curMat)  {
                 if (curVertices.empty() && curMat)  {
-                    releaseMaterial( curMat );
+                    releaseMaterial( &curMat );
                     throw DeadlyImportError("IRRMESH: indices must come after vertices");
                     throw DeadlyImportError("IRRMESH: indices must come after vertices");
                 }
                 }
 
 
@@ -272,10 +276,10 @@ void IRRMeshImporter::InternReadFile( const std::string& pFile,
                     DefaultLogger::get()->warn("IRRMESH: Found mesh with zero indices");
                     DefaultLogger::get()->warn("IRRMESH: Found mesh with zero indices");
 
 
                     // mesh - away
                     // mesh - away
-                    releaseMesh( curMesh );
+                    releaseMesh( &curMesh );
 
 
                     // material - away
                     // material - away
-                    releaseMaterial( curMat );
+                    releaseMaterial( &curMat );
 
 
                     textMeaning = 0;
                     textMeaning = 0;
                     continue;
                     continue;
@@ -487,8 +491,8 @@ void IRRMeshImporter::InternReadFile( const std::string& pFile,
     if (curMat || curMesh)  {
     if (curMat || curMesh)  {
         if ( !curMat || !curMesh)   {
         if ( !curMat || !curMesh)   {
             DefaultLogger::get()->error("IRRMESH: A buffer must contain a mesh and a material");
             DefaultLogger::get()->error("IRRMESH: A buffer must contain a mesh and a material");
-            releaseMaterial( curMat );
-            releaseMesh( curMesh );
+            releaseMaterial( &curMat );
+            releaseMesh( &curMesh );
         }
         }
         else    {
         else    {
             materials.push_back(curMat);
             materials.push_back(curMat);

+ 3 - 3
code/LWOLoader.cpp

@@ -1058,8 +1058,6 @@ void LWOImporter::LoadLWO2VertexMap(unsigned int length, bool perPoly)
     LWO::PointList& pointList = mCurLayer->mTempPoints;
     LWO::PointList& pointList = mCurLayer->mTempPoints;
     LWO::ReferrerList& refList = mCurLayer->mPointReferrers;
     LWO::ReferrerList& refList = mCurLayer->mPointReferrers;
 
 
-    float temp[4];
-
     const unsigned int numPoints = (unsigned int)pointList.size();
     const unsigned int numPoints = (unsigned int)pointList.size();
     const unsigned int numFaces  = (unsigned int)list.size();
     const unsigned int numFaces  = (unsigned int)list.size();
 
 
@@ -1123,10 +1121,12 @@ void LWOImporter::LoadLWO2VertexMap(unsigned int length, bool perPoly)
                 }
                 }
             }
             }
         }
         }
+
+        std::unique_ptr<float[]> temp(new float[type]);
         for (unsigned int l = 0; l < type;++l)
         for (unsigned int l = 0; l < type;++l)
             temp[l] = GetF4();
             temp[l] = GetF4();
 
 
-        DoRecursiveVMAPAssignment(base,type,idx, temp);
+        DoRecursiveVMAPAssignment(base,type,idx, temp.get());
         mFileBuffer += diff;
         mFileBuffer += diff;
     }
     }
 }
 }

+ 4 - 4
code/MDLLoader.cpp

@@ -172,8 +172,7 @@ void MDLImporter::InternReadFile( const std::string& pFile,
     }
     }
 
 
     // Allocate storage and copy the contents of the file to a memory buffer
     // Allocate storage and copy the contents of the file to a memory buffer
-    std::vector<unsigned char> buffer(iFileSize+1);
-    mBuffer = &buffer[0];
+    mBuffer =new unsigned char[iFileSize+1];
     file->Read( (void*)mBuffer, 1, iFileSize);
     file->Read( (void*)mBuffer, 1, iFileSize);
 
 
     // Append a binary zero to the end of the buffer.
     // Append a binary zero to the end of the buffer.
@@ -239,7 +238,8 @@ void MDLImporter::InternReadFile( const std::string& pFile,
         0.f,0.f,1.f,0.f,0.f,-1.f,0.f,0.f,0.f,0.f,0.f,1.f);
         0.f,0.f,1.f,0.f,0.f,-1.f,0.f,0.f,0.f,0.f,0.f,1.f);
 
 
     // delete the file buffer and cleanup
     // delete the file buffer and cleanup
-    AI_DEBUG_INVALIDATE_PTR(mBuffer);
+    delete [] mBuffer;
+    mBuffer= nullptr;
     AI_DEBUG_INVALIDATE_PTR(pIOHandler);
     AI_DEBUG_INVALIDATE_PTR(pIOHandler);
     AI_DEBUG_INVALIDATE_PTR(pScene);
     AI_DEBUG_INVALIDATE_PTR(pScene);
 }
 }
@@ -1557,7 +1557,7 @@ void MDLImporter::InternReadFile_3DGS_MDL7( )
 			} else {
 			} else {
 				pcNode->mName.length = ::strlen(szBuffer);
 				pcNode->mName.length = ::strlen(szBuffer);
 			}
 			}
-            ::strcpy(pcNode->mName.data,szBuffer);
+            ::strncpy(pcNode->mName.data,szBuffer,MAXLEN-1);
             ++p;
             ++p;
         }
         }
     }
     }

+ 5 - 2
code/MDLMaterialLoader.cpp

@@ -488,7 +488,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
     unsigned int iWidth,
     unsigned int iWidth,
     unsigned int iHeight)
     unsigned int iHeight)
 {
 {
-    aiTexture* pcNew = NULL;
+    aiTexture* pcNew = nullptr;
 
 
     // get the type of the skin
     // get the type of the skin
     unsigned int iMasked = (unsigned int)(iType & 0xF);
     unsigned int iMasked = (unsigned int)(iType & 0xF);
@@ -522,7 +522,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
         memcpy(pcNew->pcData,szCurrent,pcNew->mWidth);
         memcpy(pcNew->pcData,szCurrent,pcNew->mWidth);
         szCurrent += iWidth;
         szCurrent += iWidth;
     }
     }
-    if (0x7 == iMasked)
+    else if (0x7 == iMasked)
     {
     {
         // ***** REFERENCE TO EXTERNAL FILE *****
         // ***** REFERENCE TO EXTERNAL FILE *****
         if (1 != iHeight)
         if (1 != iHeight)
@@ -546,6 +546,9 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
     else if (iMasked || !iType || (iType && iWidth && iHeight))
     else if (iMasked || !iType || (iType && iWidth && iHeight))
     {
     {
         // ***** STANDARD COLOR TEXTURE *****
         // ***** STANDARD COLOR TEXTURE *****
+        if(pcNew!= nullptr)
+            delete pcNew;
+
         pcNew = new aiTexture();
         pcNew = new aiTexture();
         if (!iHeight || !iWidth)
         if (!iHeight || !iWidth)
         {
         {

+ 3 - 1
code/MakeVerboseFormat.cpp

@@ -168,6 +168,8 @@ bool MakeVerboseFormatProcess::MakeVerboseFormat(aiMesh* pcMesh)
         }
         }
     }
     }
 
 
+
+
     // build output vertex weights
     // build output vertex weights
     for (unsigned int i = 0;i < pcMesh->mNumBones;++i)
     for (unsigned int i = 0;i < pcMesh->mNumBones;++i)
     {
     {
@@ -177,11 +179,11 @@ bool MakeVerboseFormatProcess::MakeVerboseFormat(aiMesh* pcMesh)
             aiVertexWeight *weightToCopy = &( newWeights[i][0] );
             aiVertexWeight *weightToCopy = &( newWeights[i][0] );
             memcpy(pcMesh->mBones[i]->mWeights, weightToCopy,
             memcpy(pcMesh->mBones[i]->mWeights, weightToCopy,
                 sizeof(aiVertexWeight) * newWeights[i].size());
                 sizeof(aiVertexWeight) * newWeights[i].size());
-            delete[] newWeights;
         } else {
         } else {
             pcMesh->mBones[i]->mWeights = NULL;
             pcMesh->mBones[i]->mWeights = NULL;
         }
         }
     }
     }
+    delete[] newWeights;
 
 
     // delete the old members
     // delete the old members
     delete[] pcMesh->mVertices;
     delete[] pcMesh->mVertices;

+ 4 - 2
code/NDOLoader.cpp

@@ -257,7 +257,8 @@ void NDOImporter::InternReadFile( const std::string& pFile,
         }
         }
 
 
         aiMesh* mesh = new aiMesh();
         aiMesh* mesh = new aiMesh();
-        aiFace* faces = mesh->mFaces = new aiFace[mesh->mNumFaces=face_table.size()];
+        mesh->mNumFaces=face_table.size();
+        aiFace* faces = mesh->mFaces = new aiFace[mesh->mNumFaces];
 
 
         vertices.clear();
         vertices.clear();
         vertices.reserve(4 * face_table.size()); // arbitrarily chosen
         vertices.reserve(4 * face_table.size()); // arbitrarily chosen
@@ -298,7 +299,8 @@ void NDOImporter::InternReadFile( const std::string& pFile,
             pScene->mMeshes[pScene->mNumMeshes] = mesh;
             pScene->mMeshes[pScene->mNumMeshes] = mesh;
 
 
             (nd->mMeshes = new unsigned int[nd->mNumMeshes=1])[0]=pScene->mNumMeshes++;
             (nd->mMeshes = new unsigned int[nd->mNumMeshes=1])[0]=pScene->mNumMeshes++;
-        }
+        }else
+            delete mesh;
     }
     }
 }
 }
 
 

+ 2 - 2
code/SMDLoader.cpp

@@ -641,7 +641,7 @@ void SMDImporter::ComputeAbsoluteBoneTransformations()
         bone.mOffsetMatrix.Inverse();
         bone.mOffsetMatrix.Inverse();
     }
     }
 }
 }
-
+\
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 // create output materials
 // create output materials
 void SMDImporter::CreateOutputMaterials()
 void SMDImporter::CreateOutputMaterials()
@@ -660,7 +660,7 @@ void SMDImporter::CreateOutputMaterials()
 
 
         if (aszTextures[iMat].length())
         if (aszTextures[iMat].length())
         {
         {
-            ::strcpy(szName.data, aszTextures[iMat].c_str() );
+            ::strncpy(szName.data, aszTextures[iMat].c_str(),MAXLEN-1);
             szName.length = aszTextures[iMat].length();
             szName.length = aszTextures[iMat].length();
             pcMat->AddProperty(&szName,AI_MATKEY_TEXTURE_DIFFUSE(0));
             pcMat->AddProperty(&szName,AI_MATKEY_TEXTURE_DIFFUSE(0));
         }
         }

+ 1 - 1
code/XFileExporter.cpp

@@ -513,7 +513,7 @@ std::string XFileExporter::toXFileString(aiString &name)
     return str;
     return str;
 }
 }
 
 
-void XFileExporter::writePath(aiString path)
+void XFileExporter::writePath(const aiString &path)
 {
 {
     std::string str = std::string(path.C_Str());
     std::string str = std::string(path.C_Str());
     BaseImporter::ConvertUTF8toISO8859_1(str);
     BaseImporter::ConvertUTF8toISO8859_1(str);

+ 1 - 1
code/XFileExporter.h

@@ -107,7 +107,7 @@ protected:
     const ExportProperties* mProperties;
     const ExportProperties* mProperties;
 
 
     /// write a path
     /// write a path
-    void writePath(aiString path);
+    void writePath(const aiString &path);
 
 
     /// The IOSystem for output
     /// The IOSystem for output
     IOSystem* mIOSystem;
     IOSystem* mIOSystem;

+ 1 - 0
include/assimp/metadata.h

@@ -95,6 +95,7 @@ struct aiMetadataEntry
   * Helper functions to get the aiType enum entry for a type
   * Helper functions to get the aiType enum entry for a type
   */
   */
  // -------------------------------------------------------------------------------
  // -------------------------------------------------------------------------------
+
 inline aiMetadataType GetAiType( bool ) { return AI_BOOL; }
 inline aiMetadataType GetAiType( bool ) { return AI_BOOL; }
 inline aiMetadataType GetAiType( int32_t ) { return AI_INT32; }
 inline aiMetadataType GetAiType( int32_t ) { return AI_INT32; }
 inline aiMetadataType GetAiType( uint64_t ) { return AI_UINT64; }
 inline aiMetadataType GetAiType( uint64_t ) { return AI_UINT64; }

+ 1 - 1
scripts/BlenderImporter/BlenderScene.cpp.template

@@ -2,7 +2,7 @@
 Open Asset Import Library (ASSIMP)
 Open Asset Import Library (ASSIMP)
 ----------------------------------------------------------------------
 ----------------------------------------------------------------------
 
 
-Copyright (c) 2006-2010, ASSIMP Development Team
+Copyright (c) 2006-2016, ASSIMP Development Team
 All rights reserved.
 All rights reserved.
 
 
 Redistribution and use of this software in source and binary forms, 
 Redistribution and use of this software in source and binary forms, 

+ 1 - 1
scripts/BlenderImporter/BlenderSceneGen.h.template

@@ -2,7 +2,7 @@
 Open Asset Import Library (ASSIMP)
 Open Asset Import Library (ASSIMP)
 ----------------------------------------------------------------------
 ----------------------------------------------------------------------
 
 
-Copyright (c) 2006-2010, ASSIMP Development Team
+Copyright (c) 2006-2016, ASSIMP Development Team
 All rights reserved.
 All rights reserved.
 
 
 Redistribution and use of this software in source and binary forms, 
 Redistribution and use of this software in source and binary forms, 

+ 1 - 1
scripts/BlenderImporter/genblenddna.py

@@ -5,7 +5,7 @@
 # Open Asset Import Library (ASSIMP)
 # Open Asset Import Library (ASSIMP)
 # ---------------------------------------------------------------------------
 # ---------------------------------------------------------------------------
 #
 #
-# Copyright (c) 2006-2013, ASSIMP Development Team
+# Copyright (c) 2006-2016, ASSIMP Development Team
 #
 #
 # All rights reserved.
 # All rights reserved.
 #
 #

BIN
test/regression/db.zip


+ 5 - 2
test/unit/utBlenderIntermediate.cpp

@@ -48,10 +48,13 @@ class BlenderIntermediateTest : public ::testing::Test {
     // empty
     // empty
 };
 };
 
 
+#define NAME_1 "name1"
+#define NAME_2 "name2"
+
 TEST_F( BlenderIntermediateTest,ConversionData_ObjectCompareTest ) {
 TEST_F( BlenderIntermediateTest,ConversionData_ObjectCompareTest ) {
     Object obj1, obj2;
     Object obj1, obj2;
-    strncpy( obj1.id.name, "name1", 5 );
-    strncpy( obj2.id.name, "name2", 5 );
+    strncpy( obj1.id.name, NAME_1, sizeof(NAME_1) );
+    strncpy( obj2.id.name, NAME_2, sizeof(NAME_2) );
     Blender::ObjectCompare cmp_false;
     Blender::ObjectCompare cmp_false;
     bool res( cmp_false( &obj1, &obj2 ) );
     bool res( cmp_false( &obj1, &obj2 ) );
     EXPECT_FALSE( res );
     EXPECT_FALSE( res );

+ 40 - 0
tools/coverity/assimp_modeling.cpp

@@ -0,0 +1,40 @@
+/*
+Open Asset Import Library (assimp)
+----------------------------------------------------------------------
+
+Copyright (c) 2006-2015, assimp team
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
+following conditions are met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+  copyright notice, this list of conditions and the
+  following disclaimer in the documentation and/or other
+  materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+  contributors may be used to endorse or promote products
+  derived from this software without specific prior
+  written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----------------------------------------------------------------------
+*/
+//