Avoid allocating more than 16k on stack in OCT loader.

Also avoid potential heap overwrites in there.
Sadly I have no examples for OCT files and it doesn't seem like a very common format as I couldn't even find any examples online.
So just assuming my changes work.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6291 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
cutealien 2022-01-08 17:30:06 +00:00
parent 98aed6ba67
commit 9e27a6d4bf
3 changed files with 21 additions and 11 deletions

@ -1,5 +1,6 @@
-------------------------- --------------------------
Changes in 1.9 (not yet released) Changes in 1.9 (not yet released)
- Avoid allocating more than 16k on stack in OCT loader. Also avoid potential heap overwrites in there.
- obj file loader now allows using mtl files with spaces in the filename. - obj file loader now allows using mtl files with spaces in the filename.
Note that this means it no longer handles obj files which have multiple mtl files behind the mtllib command. Note that this means it no longer handles obj files which have multiple mtl files behind the mtllib command.
But Irrlicht ignored all but the first name anyway and this way of handling mtllib commands seems to be more common. But Irrlicht ignored all but the first name anyway and this way of handling mtllib commands seems to be more common.

@ -102,18 +102,29 @@ IAnimatedMesh* COCTLoader::createMesh(io::IReadFile* file)
file->read(verts, sizeof(octVert) * header.numVerts); file->read(verts, sizeof(octVert) * header.numVerts);
file->read(faces, sizeof(octFace) * header.numFaces); file->read(faces, sizeof(octFace) * header.numFaces);
//TODO: Make sure id is in the legal range for Textures and Lightmaps
u32 i; u32 i;
for (i = 0; i < header.numTextures; i++) { for (i = 0; i < header.numTextures; i++)
octTexture t; {
file->read(&t, sizeof(octTexture)); u32 id;
textures[t.id] = t; file->read(&id, sizeof(id));
if ( id >= header.numTextures )
{
os::Printer::log("COCTLoader: Invalid texture id", irr::ELL_WARNING);
id = i;
}
file->read(&textures[id], sizeof(octTexture));
} }
for (i = 0; i < header.numLightmaps; i++) { for (i = 0; i < header.numLightmaps; i++)
octLightmap t; {
file->read(&t, sizeof(octLightmap)); u32 id;
lightmaps[t.id] = t; file->read(&id, sizeof(id));
if ( id >= header.numLightmaps )
{
os::Printer::log("COCTLoader: Invalid lightmap id", irr::ELL_WARNING);
id = i;
}
file->read(&lightmaps[id], sizeof(octLightmap));
} }
file->read(lights, sizeof(octLight) * header.numLights); file->read(lights, sizeof(octLight) * header.numLights);

@ -115,12 +115,10 @@ namespace scene
}; };
struct octTexture { struct octTexture {
u32 id;
char fileName[64]; char fileName[64];
}; };
struct octLightmap { struct octLightmap {
u32 id;
u8 data[128][128][3]; u8 data[128][128][3];
}; };