fix out-of-bound access.

pull/2289/head
Kim Kulling 2018-12-30 15:59:15 +01:00
parent ba80410c48
commit 35d69c360c
1 changed files with 11 additions and 9 deletions

View File

@ -302,13 +302,14 @@ void Q3DImporter::InternReadFile( const std::string& pFile,
case 't': case 't':
pScene->mNumTextures = numTextures; pScene->mNumTextures = numTextures;
if (!numTextures)break; if (!numTextures) {
pScene->mTextures = new aiTexture*[pScene->mNumTextures]; break;
}
pScene->mTextures = new aiTexture*[pScene->mNumTextures];
// to make sure we won't crash if we leave through an exception // to make sure we won't crash if we leave through an exception
::memset(pScene->mTextures,0,sizeof(void*)*pScene->mNumTextures); ::memset(pScene->mTextures,0,sizeof(void*)*pScene->mNumTextures);
for (unsigned int i = 0; i < pScene->mNumTextures; ++i) for (unsigned int i = 0; i < pScene->mNumTextures; ++i) {
{ aiTexture* tex = pScene->mTextures[i] = new aiTexture;
aiTexture* tex = pScene->mTextures[i] = new aiTexture();
// skip the texture name // skip the texture name
while (stream.GetI1()); while (stream.GetI1());
@ -317,15 +318,16 @@ void Q3DImporter::InternReadFile( const std::string& pFile,
tex->mWidth = (unsigned int)stream.GetI4(); tex->mWidth = (unsigned int)stream.GetI4();
tex->mHeight = (unsigned int)stream.GetI4(); tex->mHeight = (unsigned int)stream.GetI4();
if (!tex->mWidth || !tex->mHeight) if (!tex->mWidth || !tex->mHeight) {
throw DeadlyImportError("Quick3D: Invalid texture. Width or height is zero"); throw DeadlyImportError("Quick3D: Invalid texture. Width or height is zero");
}
unsigned int mul = tex->mWidth * tex->mHeight; unsigned int mul = tex->mWidth * tex->mHeight;
aiTexel* begin = tex->pcData = new aiTexel[mul]; aiTexel* begin = tex->pcData = new aiTexel[mul];
aiTexel* const end = & begin [mul]; aiTexel* const end = & begin[mul-1] +1;
for (;begin != end; ++begin)
{ for (;begin != end; ++begin) {
begin->r = stream.GetI1(); begin->r = stream.GetI1();
begin->g = stream.GetI1(); begin->g = stream.GetI1();
begin->b = stream.GetI1(); begin->b = stream.GetI1();