diff --git a/code/XGLLoader.cpp b/code/XGLLoader.cpp index 2d7a40362..a9fd6a5ab 100644 --- a/code/XGLLoader.cpp +++ b/code/XGLLoader.cpp @@ -72,17 +72,6 @@ using namespace irr::io; #endif -// scopeguard for a malloc'ed buffer -struct free_it -{ - free_it(void* free) : free(free) {} - ~free_it() { - ::free(this->free); - } - - void* free; -}; - namespace Assimp { // this has to be in here because LogFunctions is in ::Assimp template<> const char* LogFunctions::Prefix() { @@ -155,8 +144,7 @@ void XGLImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) { #ifndef ASSIMP_BUILD_NO_COMPRESSED_XGL - Bytef* dest = NULL; - free_it free_it_really(dest); + std::vector uncompressed; #endif m_scene = pScene; @@ -192,6 +180,7 @@ void XGLImporter::InternReadFile( const std::string& pFile, size_t total = 0l; + // TODO: be smarter about this, decompress directly into heap buffer // and decompress the data .... do 1k chunks in the hope that we won't kill the stack #define MYBLOCK 1024 Bytef block[MYBLOCK]; @@ -206,8 +195,8 @@ void XGLImporter::InternReadFile( const std::string& pFile, } const size_t have = MYBLOCK - zstream.avail_out; total += have; - dest = reinterpret_cast( realloc(dest,total) ); - memcpy(dest + total - have,block,have); + uncompressed.resize(total); + memcpy(uncompressed.data() + total - have,block,have); } while (ret != Z_STREAM_END); @@ -215,7 +204,7 @@ void XGLImporter::InternReadFile( const std::string& pFile, inflateEnd(&zstream); // replace the input stream with a memory stream - stream.reset(new MemoryIOStream(reinterpret_cast(dest),total)); + stream.reset(new MemoryIOStream(reinterpret_cast(uncompressed.data()),total)); #endif }