Merge branch 'master' into fix-skipspaces
commit
e52585a16c
|
@ -78,7 +78,15 @@ static constexpr aiImporterDesc desc = {
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Recursive parsing of LWS files
|
// Recursive parsing of LWS files
|
||||||
void LWS::Element::Parse(const char *&buffer, const char *end) {
|
namespace {
|
||||||
|
constexpr int MAX_DEPTH = 1000; // Define the maximum depth allowed
|
||||||
|
}
|
||||||
|
|
||||||
|
void LWS::Element::Parse(const char *&buffer, const char *end, int depth) {
|
||||||
|
if (depth > MAX_DEPTH) {
|
||||||
|
throw std::runtime_error("Maximum recursion depth exceeded in LWS::Element::Parse");
|
||||||
|
}
|
||||||
|
|
||||||
for (; SkipSpacesAndLineEnd(&buffer, end); SkipLine(&buffer, end)) {
|
for (; SkipSpacesAndLineEnd(&buffer, end); SkipLine(&buffer, end)) {
|
||||||
|
|
||||||
// begin of a new element with children
|
// begin of a new element with children
|
||||||
|
@ -121,7 +129,7 @@ void LWS::Element::Parse(const char *&buffer, const char *end) {
|
||||||
|
|
||||||
// parse more elements recursively
|
// parse more elements recursively
|
||||||
if (sub) {
|
if (sub) {
|
||||||
children.back().Parse(buffer, end);
|
children.back().Parse(buffer, end, depth + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,7 @@ public:
|
||||||
std::list<Element> children;
|
std::list<Element> children;
|
||||||
|
|
||||||
//! Recursive parsing function
|
//! Recursive parsing function
|
||||||
void Parse(const char *&buffer, const char *end);
|
void Parse(const char *&buffer, const char *end, int depth = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AI_LWS_MASK (0xffffffff >> 4u)
|
#define AI_LWS_MASK (0xffffffff >> 4u)
|
||||||
|
|
|
@ -724,6 +724,7 @@ void MD3Importer::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy
|
||||||
std::vector<unsigned char> mBuffer2(fileSize);
|
std::vector<unsigned char> mBuffer2(fileSize);
|
||||||
file->Read(&mBuffer2[0], 1, fileSize);
|
file->Read(&mBuffer2[0], 1, fileSize);
|
||||||
mBuffer = &mBuffer2[0];
|
mBuffer = &mBuffer2[0];
|
||||||
|
const unsigned char* bufferEnd = mBuffer + fileSize;
|
||||||
|
|
||||||
pcHeader = (BE_NCONST MD3::Header *)mBuffer;
|
pcHeader = (BE_NCONST MD3::Header *)mBuffer;
|
||||||
|
|
||||||
|
@ -749,9 +750,15 @@ void MD3Importer::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy
|
||||||
|
|
||||||
// Navigate to the list of surfaces
|
// Navigate to the list of surfaces
|
||||||
BE_NCONST MD3::Surface *pcSurfaces = (BE_NCONST MD3::Surface *)(mBuffer + pcHeader->OFS_SURFACES);
|
BE_NCONST MD3::Surface *pcSurfaces = (BE_NCONST MD3::Surface *)(mBuffer + pcHeader->OFS_SURFACES);
|
||||||
|
if ((const unsigned char*)pcSurfaces + sizeof(MD3::Surface) * pcHeader->NUM_SURFACES > bufferEnd) {
|
||||||
|
throw DeadlyImportError("MD3 surface headers are outside the file");
|
||||||
|
}
|
||||||
|
|
||||||
// Navigate to the list of tags
|
// Navigate to the list of tags
|
||||||
BE_NCONST MD3::Tag *pcTags = (BE_NCONST MD3::Tag *)(mBuffer + pcHeader->OFS_TAGS);
|
BE_NCONST MD3::Tag *pcTags = (BE_NCONST MD3::Tag *)(mBuffer + pcHeader->OFS_TAGS);
|
||||||
|
if ((const unsigned char*)pcTags + sizeof(MD3::Tag) * pcHeader->NUM_TAGS > bufferEnd) {
|
||||||
|
throw DeadlyImportError("MD3 tags are outside the file");
|
||||||
|
}
|
||||||
|
|
||||||
// Allocate output storage
|
// Allocate output storage
|
||||||
pScene->mNumMeshes = pcHeader->NUM_SURFACES;
|
pScene->mNumMeshes = pcHeader->NUM_SURFACES;
|
||||||
|
@ -1026,6 +1033,10 @@ void MD3Importer::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy
|
||||||
|
|
||||||
for (unsigned int i = 0; i < pcHeader->NUM_TAGS; ++i, ++pcTags) {
|
for (unsigned int i = 0; i < pcHeader->NUM_TAGS; ++i, ++pcTags) {
|
||||||
aiNode *nd = pScene->mRootNode->mChildren[i] = new aiNode();
|
aiNode *nd = pScene->mRootNode->mChildren[i] = new aiNode();
|
||||||
|
if ((const unsigned char*)pcTags + sizeof(MD3::Tag) > bufferEnd) {
|
||||||
|
throw DeadlyImportError("MD3 tag is outside the file");
|
||||||
|
}
|
||||||
|
|
||||||
nd->mName.Set((const char *)pcTags->NAME);
|
nd->mName.Set((const char *)pcTags->NAME);
|
||||||
nd->mParent = pScene->mRootNode;
|
nd->mParent = pScene->mRootNode;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue