From c6b516b68ba509dfab729763e427ceee9e3d14ba Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 4 Jul 2014 00:22:13 +0200 Subject: [PATCH] bugfix: handling possible nullptr access. update: replace clear be resize( 0 ) at some places to avoid double allocations ( only a micro optimization ). Signed-off-by: Kim Kulling --- code/CalcTangentsProcess.cpp | 2 +- code/ConvertToLHProcess.cpp | 28 ++++++++---- code/DeboneProcess.cpp | 2 +- code/ParsingUtils.h | 84 +++++++++++++++++++++++++----------- 4 files changed, 79 insertions(+), 37 deletions(-) diff --git a/code/CalcTangentsProcess.cpp b/code/CalcTangentsProcess.cpp index 4ceca3f7a..338c16aaa 100644 --- a/code/CalcTangentsProcess.cpp +++ b/code/CalcTangentsProcess.cpp @@ -271,7 +271,7 @@ bool CalcTangentsProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) const aiVector3D& origNorm = pMesh->mNormals[a]; const aiVector3D& origTang = pMesh->mTangents[a]; const aiVector3D& origBitang = pMesh->mBitangents[a]; - closeVertices.clear(); + closeVertices.resize( 0 ); // find all vertices close to that position vertexFinder->FindPositions( origPos, posEpsilon, verticesFound); diff --git a/code/ConvertToLHProcess.cpp b/code/ConvertToLHProcess.cpp index 3a51daf57..4f5b40840 100644 --- a/code/ConvertToLHProcess.cpp +++ b/code/ConvertToLHProcess.cpp @@ -57,12 +57,15 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer MakeLeftHandedProcess::MakeLeftHandedProcess() -{} +: BaseProcess() { + // empty +} // ------------------------------------------------------------------------------------------------ // Destructor, private as well -MakeLeftHandedProcess::~MakeLeftHandedProcess() -{} +MakeLeftHandedProcess::~MakeLeftHandedProcess() { + // empty +} // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. @@ -121,8 +124,9 @@ void MakeLeftHandedProcess::ProcessNode( aiNode* pNode, const aiMatrix4x4& pPare pNode->mTransformation.d3 = -pNode->mTransformation.d3; // useless, but anyways... // continue for all children - for( size_t a = 0; a < pNode->mNumChildren; ++a) - ProcessNode( pNode->mChildren[a], pParentGlobalRotation * pNode->mTransformation); + for( size_t a = 0; a < pNode->mNumChildren; ++a ) { + ProcessNode( pNode->mChildren[ a ], pParentGlobalRotation * pNode->mTransformation ); + } } // ------------------------------------------------------------------------------------------------ @@ -244,6 +248,10 @@ void FlipUVsProcess::ProcessMaterial (aiMaterial* _mat) aiMaterial* mat = (aiMaterial*)_mat; for (unsigned int a = 0; a < mat->mNumProperties;++a) { aiMaterialProperty* prop = mat->mProperties[a]; + if( !prop ) { + DefaultLogger::get()->debug( "Property is null" ); + continue; + } // UV transformation key? if (!::strcmp( prop->mKey.data, "$tex.uvtrafo")) { @@ -263,11 +271,13 @@ void FlipUVsProcess::ProcessMesh( aiMesh* pMesh) { // mirror texture y coordinate for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; a++) { - if( !pMesh->HasTextureCoords( a)) - break; + if( !pMesh->HasTextureCoords( a ) ) { + break; + } - for( unsigned int b = 0; b < pMesh->mNumVertices; b++) - pMesh->mTextureCoords[a][b].y = 1.0f - pMesh->mTextureCoords[a][b].y; + for( unsigned int b = 0; b < pMesh->mNumVertices; b++ ) { + pMesh->mTextureCoords[ a ][ b ].y = 1.0f - pMesh->mTextureCoords[ a ][ b ].y; + } } } diff --git a/code/DeboneProcess.cpp b/code/DeboneProcess.cpp index 7e72b836e..8a2a9e640 100644 --- a/code/DeboneProcess.cpp +++ b/code/DeboneProcess.cpp @@ -111,7 +111,7 @@ void DeboneProcess::Execute( aiScene* pScene) if(numSplits) { // we need to do something. Let's go. - mSubMeshIndices.clear(); + //mSubMeshIndices.clear(); really needed? mSubMeshIndices.resize(pScene->mNumMeshes); // build a new array of meshes for the scene diff --git a/code/ParsingUtils.h b/code/ParsingUtils.h index d0e8ba681..1ed8ee923 100644 --- a/code/ParsingUtils.h +++ b/code/ParsingUtils.h @@ -49,14 +49,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { - // NOTE: the functions below are mostly intended as replacement for - // std::upper, std::lower, std::isupper, std::islower, std::isspace. - // we don't bother of locales. We don't want them. We want reliable - // (i.e. identical) results across all locales. +// NOTE: the functions below are mostly intended as replacement for +// std::upper, std::lower, std::isupper, std::islower, std::isspace. +// we don't bother of locales. We don't want them. We want reliable +// (i.e. identical) results across all locales. - // The functions below accept any character type, but know only - // about ASCII. However, UTF-32 is the only safe ASCII superset to - // use since it doesn't have multibyte sequences. +// The functions below accept any character type, but know only +// about ASCII. However, UTF-32 is the only safe ASCII superset to +// use since it doesn't have multi-byte sequences. + +static const unsigned int BufferSize = 4096; // --------------------------------------------------------------------------------- template @@ -64,118 +66,145 @@ AI_FORCE_INLINE char_t ToLower( char_t in) { return (in >= (char_t)'A' && in <= (char_t)'Z') ? (char_t)(in+0x20) : in; } + // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE char_t ToUpper( char_t in) -{ - return (in >= (char_t)'a' && in <= (char_t)'z') ? (char_t)(in-0x20) : in; +AI_FORCE_INLINE char_t ToUpper( char_t in) { + return (in >= (char_t)'a' && in <= (char_t)'z') ? (char_t)(in-0x20) : in; } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool IsUpper( char_t in) { return (in >= (char_t)'A' && in <= (char_t)'Z'); } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool IsLower( char_t in) { return (in >= (char_t)'a' && in <= (char_t)'z'); } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool IsSpace( char_t in) { return (in == (char_t)' ' || in == (char_t)'\t'); } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool IsLineEnd( char_t in) { return (in == (char_t)'\r' || in == (char_t)'\n' || in == (char_t)'\0'); } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool IsSpaceOrNewLine( char_t in) { return IsSpace(in) || IsLineEnd(in); } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool SkipSpaces( const char_t* in, const char_t** out) { - while (*in == (char_t)' ' || *in == (char_t)'\t')in++; + while( *in == ( char_t )' ' || *in == ( char_t )'\t' ) { + ++in; + } *out = in; return !IsLineEnd(*in); } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool SkipSpaces( const char_t** inout) { return SkipSpaces(*inout,inout); } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool SkipLine( const char_t* in, const char_t** out) { - while (*in != (char_t)'\r' && *in != (char_t)'\n' && *in != (char_t)'\0')in++; + while( *in != ( char_t )'\r' && *in != ( char_t )'\n' && *in != ( char_t )'\0' ) { + ++in; + } // files are opened in binary mode. Ergo there are both NL and CR - while (*in == (char_t)'\r' || *in == (char_t)'\n')in++; + while( *in == ( char_t )'\r' || *in == ( char_t )'\n' ) { + ++in; + } *out = in; return *in != (char_t)'\0'; } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool SkipLine( const char_t** inout) { return SkipLine(*inout,inout); } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool SkipSpacesAndLineEnd( const char_t* in, const char_t** out) { - while (*in == (char_t)' ' || *in == (char_t)'\t' || - *in == (char_t)'\r' || *in == (char_t)'\n')in++; + while( *in == ( char_t )' ' || *in == ( char_t )'\t' || *in == ( char_t )'\r' || *in == ( char_t )'\n' ) { + ++in; + } *out = in; return *in != '\0'; } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool SkipSpacesAndLineEnd( const char_t** inout) { return SkipSpacesAndLineEnd(*inout,inout); } + // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE bool GetNextLine(const char_t*& buffer, char_t out[4096]) +AI_FORCE_INLINE bool GetNextLine( const char_t*& buffer, char_t out[ BufferSize ] ) { - if ((char_t)'\0' == *buffer)return false; + if( ( char_t )'\0' == *buffer ) { + return false; + } char* _out = out; - char* const end = _out+4096; - while (!IsLineEnd( *buffer ) && _out < end) - *_out++ = *buffer++; + char* const end = _out + BufferSize; + while( !IsLineEnd( *buffer ) && _out < end ) { + *_out++ = *buffer++; + } *_out = (char_t)'\0'; - while (IsLineEnd( *buffer ) && '\0' != *buffer)++buffer; - return true; + while( IsLineEnd( *buffer ) && '\0' != *buffer ) { + ++buffer; + } + + return true; } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool IsNumeric( char_t in) { return ( in >= '0' && in <= '9' ) || '-' == in || '+' == in; } + // --------------------------------------------------------------------------------- template AI_FORCE_INLINE bool TokenMatch(char_t*& in, const char* token, unsigned int len) { - if (!::strncmp(token,in,len) && IsSpaceOrNewLine(in[len])) - { + if (!::strncmp(token,in,len) && IsSpaceOrNewLine(in[len])) { in += len+1; return true; } + return false; } // --------------------------------------------------------------------------------- @@ -186,8 +215,7 @@ AI_FORCE_INLINE bool TokenMatch(char_t*& in, const char* token, unsigned int len */ AI_FORCE_INLINE bool TokenMatchI(const char*& in, const char* token, unsigned int len) { - if (!ASSIMP_strincmp(token,in,len) && IsSpaceOrNewLine(in[len])) - { + if (!ASSIMP_strincmp(token,in,len) && IsSpaceOrNewLine(in[len])) { in += len+1; return true; } @@ -207,5 +235,9 @@ AI_FORCE_INLINE std::string GetNextToken(const char*& in) while (!IsSpaceOrNewLine(*in))++in; return std::string(cur,(size_t)(in-cur)); } + +// --------------------------------------------------------------------------------- + } // ! namespace Assimp + #endif // ! AI_PARSING_UTILS_H_INC