diff --git a/code/3DSLoader.cpp b/code/3DSLoader.cpp index 336a1390b..f16f3a27d 100644 --- a/code/3DSLoader.cpp +++ b/code/3DSLoader.cpp @@ -79,6 +79,8 @@ static const aiImporterDesc desc = { Discreet3DS::Chunk chunk; \ ReadChunk(&chunk); \ int chunkSize = chunk.Size-sizeof(Discreet3DS::Chunk); \ + if(chunkSize <= 0) \ + continue; \ const int oldReadLimit = stream->GetReadLimit(); \ stream->SetReadLimit(stream->GetCurrentPos() + chunkSize); \ diff --git a/code/DefaultIOStream.cpp b/code/DefaultIOStream.cpp index 9f9a3de78..1553bd8c1 100644 --- a/code/DefaultIOStream.cpp +++ b/code/DefaultIOStream.cpp @@ -110,7 +110,14 @@ size_t DefaultIOStream::FileSize() const if (SIZE_MAX == cachedSize) { - // TODO: Is that really faster if we're already owning a handle to the file? + // Although fseek/ftell would allow us to reuse the exising file handle here, + // it is generally unsafe because: + // - For binary streams, it is not technically well-defined + // - For text files the results are meaningless + // That's why we use the safer variant fstat here. + // + // See here for details: + // https://www.securecoding.cert.org/confluence/display/seccode/FIO19-C.+Do+not+use+fseek()+and+ftell()+to+compute+the+size+of+a+regular+file #if defined _WIN32 && !defined __GNUC__ struct __stat64 fileStat; int err = _stat64( mFilename.c_str(), &fileStat ); diff --git a/code/SortByPTypeProcess.cpp b/code/SortByPTypeProcess.cpp index 50edf29a5..c38bdd9cb 100644 --- a/code/SortByPTypeProcess.cpp +++ b/code/SortByPTypeProcess.cpp @@ -151,7 +151,7 @@ void SortByPTypeProcess::Execute( aiScene* pScene) std::vector::iterator meshIdx = replaceMeshIndex.begin(); for (unsigned int i = 0; i < pScene->mNumMeshes;++i) { - aiMesh* mesh = pScene->mMeshes[i]; + aiMesh* const mesh = pScene->mMeshes[i]; ai_assert(0 != mesh->mPrimitiveTypes); // if there's just one primitive type in the mesh there's nothing to do for us @@ -367,6 +367,9 @@ void SortByPTypeProcess::Execute( aiScene* pScene) // delete the input mesh delete mesh; + + // avoid invalid pointer + pScene->mMeshes[i] = NULL; } if (outMeshes.empty())