Fix: Fix memleak when exiting method by exception
parent
dd6bcecf56
commit
b170370e5c
|
@ -482,37 +482,43 @@ 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();
|
|
||||||
if (!pHint) {
|
|
||||||
pHint = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pBuffer || !pLength || strlen(pHint) > MaxLenHint ) {
|
|
||||||
pimpl->mErrorString = "Invalid parameters passed to ReadFileFromMemory()";
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// prevent deletion of the previous IOHandler
|
|
||||||
IOSystem* io = pimpl->mIOHandler;
|
IOSystem* io = pimpl->mIOHandler;
|
||||||
pimpl->mIOHandler = nullptr;
|
try {
|
||||||
|
if (pHint == nullptr) {
|
||||||
|
pHint = "";
|
||||||
|
}
|
||||||
|
if (!pBuffer || !pLength || strlen(pHint) > MaxLenHint ) {
|
||||||
|
pimpl->mErrorString = "Invalid parameters passed to ReadFileFromMemory()";
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
// prevent deletion of the previous IOHandler
|
||||||
|
pimpl->mIOHandler = nullptr;
|
||||||
|
|
||||||
SetIOHandler(new MemoryIOSystem((const uint8_t*)pBuffer,pLength,io));
|
SetIOHandler(new MemoryIOSystem((const uint8_t*)pBuffer,pLength,io));
|
||||||
|
|
||||||
// read the file and recover the previous IOSystem
|
// read the file and recover the previous IOSystem
|
||||||
static const size_t BufSize(Importer::MaxLenHint + 28);
|
static const size_t BufSize(Importer::MaxLenHint + 28);
|
||||||
char fbuff[BufSize];
|
char fbuff[BufSize];
|
||||||
ai_snprintf(fbuff, BufSize, "%s.%s",AI_MEMORYIO_MAGIC_FILENAME,pHint);
|
ai_snprintf(fbuff, BufSize, "%s.%s",AI_MEMORYIO_MAGIC_FILENAME,pHint);
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
@ -46,8 +46,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
using namespace Assimp;
|
using namespace Assimp;
|
||||||
|
|
||||||
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataSize) {
|
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataSize) {
|
||||||
aiLogStream stream = aiGetPredefinedLogStream(aiDefaultLogStream_STDOUT,NULL);
|
aiLogStream stream = aiGetPredefinedLogStream(aiDefaultLogStream_STDOUT,NULL);
|
||||||
aiAttachLogStream(&stream);
|
aiAttachLogStream(&stream);
|
||||||
|
|
||||||
Importer importer;
|
Importer importer;
|
||||||
const aiScene *sc = importer.ReadFileFromMemory(data, dataSize,
|
const aiScene *sc = importer.ReadFileFromMemory(data, dataSize,
|
||||||
|
@ -57,3 +57,4 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataSize) {
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue