MDLImporter: Use unique_ptr

Fixes a double free
pull/1656/head
Turo Lamminen 2017-12-24 22:17:11 +02:00
parent 55e69272bd
commit dc94e5921e
1 changed files with 10 additions and 12 deletions

View File

@ -56,6 +56,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <assimp/Defines.h> #include <assimp/Defines.h>
#include "qnan.h" #include "qnan.h"
#include <memory>
using namespace Assimp; using namespace Assimp;
static aiTexel* const bad_texel = reinterpret_cast<aiTexel*>(SIZE_MAX); static aiTexel* const bad_texel = reinterpret_cast<aiTexel*>(SIZE_MAX);
@ -489,7 +491,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
unsigned int iWidth, unsigned int iWidth,
unsigned int iHeight) unsigned int iHeight)
{ {
aiTexture* pcNew = nullptr; std::unique_ptr<aiTexture> pcNew;
// get the type of the skin // get the type of the skin
unsigned int iMasked = (unsigned int)(iType & 0xF); unsigned int iMasked = (unsigned int)(iType & 0xF);
@ -509,7 +511,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
"but texture height is not equal to 1, which is not supported by MED"); "but texture height is not equal to 1, which is not supported by MED");
} }
pcNew = new aiTexture(); pcNew.reset(new aiTexture());
pcNew->mHeight = 0; pcNew->mHeight = 0;
pcNew->mWidth = iWidth; pcNew->mWidth = iWidth;
@ -546,7 +548,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
} }
else if (iMasked || !iType || (iType && iWidth && iHeight)) else if (iMasked || !iType || (iType && iWidth && iHeight))
{ {
pcNew = new aiTexture(); pcNew.reset(new aiTexture());
if (!iHeight || !iWidth) if (!iHeight || !iWidth)
{ {
DefaultLogger::get()->warn("Found embedded texture, but its width " DefaultLogger::get()->warn("Found embedded texture, but its width "
@ -577,7 +579,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
pcNew->mHeight = iHeight; pcNew->mHeight = iHeight;
unsigned int iSkip = 0; unsigned int iSkip = 0;
ParseTextureColorData(szCurrent,iMasked,&iSkip,pcNew); ParseTextureColorData(szCurrent,iMasked,&iSkip,pcNew.get());
// skip length of texture data // skip length of texture data
szCurrent += iSkip; szCurrent += iSkip;
@ -588,7 +590,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
// texture instead of material colors ... posssible they have // texture instead of material colors ... posssible they have
// been converted to MDL7 from other formats, such as MDL5 // been converted to MDL7 from other formats, such as MDL5
aiColor4D clrTexture; aiColor4D clrTexture;
if (pcNew)clrTexture = ReplaceTextureWithColor(pcNew); if (pcNew)clrTexture = ReplaceTextureWithColor(pcNew.get());
else clrTexture.r = get_qnan(); else clrTexture.r = get_qnan();
// check whether a material definition is contained in the skin // check whether a material definition is contained in the skin
@ -680,8 +682,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
// we don't need the texture anymore // we don't need the texture anymore
if (is_not_qnan(clrTexture.r)) if (is_not_qnan(clrTexture.r))
{ {
delete pcNew; pcNew.reset();
pcNew = NULL;
} }
// If an ASCII effect description (HLSL?) is contained in the file, // If an ASCII effect description (HLSL?) is contained in the file,
@ -716,7 +717,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
{ {
pScene->mNumTextures = 1; pScene->mNumTextures = 1;
pScene->mTextures = new aiTexture*[1]; pScene->mTextures = new aiTexture*[1];
pScene->mTextures[0] = pcNew; pScene->mTextures[0] = pcNew.release();
} }
else else
{ {
@ -726,16 +727,13 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
pScene->mTextures[i] = pc[i]; pScene->mTextures[i] = pc[i];
} }
pScene->mTextures[pScene->mNumTextures] = pcNew; pScene->mTextures[pScene->mNumTextures] = pcNew.release();
pScene->mNumTextures++; pScene->mNumTextures++;
delete[] pc; delete[] pc;
} }
} }
VALIDATE_FILE_SIZE(szCurrent); VALIDATE_FILE_SIZE(szCurrent);
*szCurrentOut = szCurrent; *szCurrentOut = szCurrent;
if ( nullptr != pcNew ) {
delete pcNew;
}
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------