Fix: Fix memleak when exiting method by exception

pull/4943/head
Kim Kulling 2023-02-08 21:29:54 +01:00
parent dd6bcecf56
commit b170370e5c
3 changed files with 38 additions and 35 deletions

View File

@ -482,24 +482,19 @@ bool Importer::ValidateFlags(unsigned int pFlags) const {
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
const aiScene* Importer::ReadFileFromMemory( const void* pBuffer, const aiScene* Importer::ReadFileFromMemory(const void* pBuffer, size_t pLength, unsigned int pFlags, const char* pHint ) {
size_t pLength,
unsigned int pFlags,
const char* pHint /*= ""*/) {
ai_assert(nullptr != pimpl); ai_assert(nullptr != pimpl);
ASSIMP_BEGIN_EXCEPTION_REGION(); IOSystem* io = pimpl->mIOHandler;
if (!pHint) { try {
if (pHint == nullptr) {
pHint = ""; pHint = "";
} }
if (!pBuffer || !pLength || strlen(pHint) > MaxLenHint ) { if (!pBuffer || !pLength || strlen(pHint) > MaxLenHint ) {
pimpl->mErrorString = "Invalid parameters passed to ReadFileFromMemory()"; pimpl->mErrorString = "Invalid parameters passed to ReadFileFromMemory()";
return nullptr; return nullptr;
} }
// prevent deletion of the previous IOHandler // prevent deletion of the previous IOHandler
IOSystem* io = pimpl->mIOHandler;
pimpl->mIOHandler = nullptr; pimpl->mIOHandler = nullptr;
SetIOHandler(new MemoryIOSystem((const uint8_t*)pBuffer,pLength,io)); SetIOHandler(new MemoryIOSystem((const uint8_t*)pBuffer,pLength,io));
@ -511,8 +506,19 @@ const aiScene* Importer::ReadFileFromMemory( const void* pBuffer,
ReadFile(fbuff,pFlags); ReadFile(fbuff,pFlags);
SetIOHandler(io); SetIOHandler(io);
} catch(const DeadlyImportError &e) {
pimpl->mErrorString = e.what();
pimpl->mException = std::current_exception();
SetIOHandler(io);
return ExceptionSwallower<const aiScene*>()(); \
} catch(...) {
pimpl->mErrorString = "Unknown exception";
pimpl->mException = std::current_exception();
SetIOHandler(io);
return ExceptionSwallower<const aiScene*>()(); \
}
ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(const aiScene*, pimpl->mErrorString, pimpl->mException);
return pimpl->mScene; return pimpl->mScene;
} }

View File

@ -3,7 +3,7 @@
Open Asset Import Library (assimp) Open Asset Import Library (assimp)
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
Copyright (c) 2006-2020, assimp team Copyright (c) 2006-2023, assimp team
All rights reserved. All rights reserved.
@ -57,3 +57,4 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataSize) {
return 0; return 0;
} }

View File

@ -4,7 +4,6 @@ Open Asset Import Library (assimp)
Copyright (c) 2006-2022, assimp team Copyright (c) 2006-2022, assimp 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,
@ -153,11 +152,7 @@ private:
class MemoryIOSystem : public IOSystem { class MemoryIOSystem : public IOSystem {
public: public:
/** Constructor. */ /** Constructor. */
MemoryIOSystem(const uint8_t* buff, size_t len, IOSystem* io) MemoryIOSystem(const uint8_t* buff, size_t len, IOSystem* io) : buffer(buff), length(len), existing_io(io) {
: buffer(buff)
, length(len)
, existing_io(io)
, created_streams() {
// empty // empty
} }
@ -167,6 +162,7 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
/** Tests for the existence of a file at the given path. */ /** Tests for the existence of a file at the given path. */
bool Exists(const char* pFile) const override { bool Exists(const char* pFile) const override {
printf("Exists\n");
if (0 == strncmp( pFile, AI_MEMORYIO_MAGIC_FILENAME, AI_MEMORYIO_MAGIC_FILENAME_LENGTH ) ) { if (0 == strncmp( pFile, AI_MEMORYIO_MAGIC_FILENAME, AI_MEMORYIO_MAGIC_FILENAME_LENGTH ) ) {
return true; return true;
} }
@ -187,7 +183,7 @@ public:
created_streams.emplace_back(new MemoryIOStream(buffer, length)); created_streams.emplace_back(new MemoryIOStream(buffer, length));
return created_streams.back(); return created_streams.back();
} }
return existing_io ? existing_io->Open(pFile, pMode) : NULL; return existing_io ? existing_io->Open(pFile, pMode) : nullptr;
} }
// ------------------------------------------------------------------- // -------------------------------------------------------------------
@ -246,4 +242,4 @@ private:
} // end namespace Assimp } // end namespace Assimp
#endif #endif // AI_MEMORYIOSTREAM_H_INC