1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2025-06-08 09:31:58 +00:00

Fix possible crash when saving animation to non-existing file + loading malformed XML from skin file.

Also fix skeletal cache memory leak.
This commit is contained in:
fgenesis 2014-09-16 00:29:57 +02:00
parent 26dc8560b7
commit 15379db4b8
3 changed files with 16 additions and 9 deletions

View file

@ -547,13 +547,13 @@ tinyxml2::XMLError readXML(const std::string& fn, tinyxml2::XMLDocument& doc)
return err; return err;
} }
tinyxml2::XMLDocument *readXML(const std::string& fn, tinyxml2::XMLError *perr /* = 0 */) tinyxml2::XMLDocument *readXML(const std::string& fn, tinyxml2::XMLError *perr /* = 0 */, bool keepEmpty /* = false */)
{ {
tinyxml2::XMLDocument *doc = new tinyxml2::XMLDocument(); tinyxml2::XMLDocument *doc = new tinyxml2::XMLDocument();
tinyxml2::XMLError err = readXML(fn, *doc); tinyxml2::XMLError err = readXML(fn, *doc);
if(perr) if(perr)
*perr = err; *perr = err;
if(err != tinyxml2::XML_SUCCESS) if(err != tinyxml2::XML_SUCCESS && !keepEmpty)
{ {
delete doc; delete doc;
doc = NULL; doc = NULL;

View file

@ -206,7 +206,7 @@ bool exists(const std::string &f, bool makeFatal = false, bool skipVFS = false);
void errorLog(const std::string &s); void errorLog(const std::string &s);
void debugLog(const std::string &s); void debugLog(const std::string &s);
char *readFile(const std::string& path, unsigned long *size_ret = 0); char *readFile(const std::string& path, unsigned long *size_ret = 0);
tinyxml2::XMLDocument *readXML(const std::string& fn, tinyxml2::XMLError *perr = 0); tinyxml2::XMLDocument *readXML(const std::string& fn, tinyxml2::XMLError *perr = 0, bool keepEmpty = false);
tinyxml2::XMLError readXML(const std::string& fn, tinyxml2::XMLDocument& doc); tinyxml2::XMLError readXML(const std::string& fn, tinyxml2::XMLDocument& doc);
char *readCompressedFile(std::string path, unsigned long *size_ret = 0); char *readCompressedFile(std::string path, unsigned long *size_ret = 0);
void forEachFile(std::string path, std::string type, void callback(const std::string &filename, intptr_t param), intptr_t param); void forEachFile(std::string path, std::string type, void callback(const std::string &filename, intptr_t param), intptr_t param);

View file

@ -34,13 +34,13 @@ std::string SkeletalSprite::secondaryAnimationPath = "";
static std::map<std::string, XMLDocument*> skelCache; static std::map<std::string, XMLDocument*> skelCache;
static XMLDocument *_retrieveSkeletalXML(const std::string& name) static XMLDocument *_retrieveSkeletalXML(const std::string& name, bool keepEmpty)
{ {
std::map<std::string, XMLDocument*>::iterator it = skelCache.find(name); std::map<std::string, XMLDocument*>::iterator it = skelCache.find(name);
if(it != skelCache.end()) if(it != skelCache.end())
return it->second; return it->second;
XMLDocument *doc = readXML(name); XMLDocument *doc = readXML(name, NULL, keepEmpty);
if(doc) if(doc)
skelCache[name] = doc; skelCache[name] = doc;
@ -49,6 +49,8 @@ static XMLDocument *_retrieveSkeletalXML(const std::string& name)
void SkeletalSprite::clearCache() void SkeletalSprite::clearCache()
{ {
for(std::map<std::string, XMLDocument*>::iterator it = skelCache.begin(); it != skelCache.end(); ++it)
delete it->second;
skelCache.clear(); skelCache.clear();
} }
@ -869,7 +871,7 @@ bool SkeletalSprite::saveSkeletal(const std::string &fn)
} }
int i = 0; int i = 0;
XMLDocument *xml = _retrieveSkeletalXML(file); XMLDocument *xml = _retrieveSkeletalXML(file, true);
xml->Clear(); xml->Clear();
XMLElement *animationLayers = xml->NewElement("AnimationLayers"); XMLElement *animationLayers = xml->NewElement("AnimationLayers");
@ -1179,10 +1181,15 @@ void SkeletalSprite::loadSkin(const std::string &fn)
if (!exists(file)) if (!exists(file))
{ {
errorLog("Could not load skin[" + file + "]"); errorLog("Could not load skin[" + file + "] - File not found.");
return;
}
XMLDocument *d = _retrieveSkeletalXML(file, false);
if(!d)
{
errorLog("Could not load skin[" + file + "] - Malformed XML.");
return; return;
} }
XMLDocument *d = _retrieveSkeletalXML(file);
XMLElement *bonesXml = d->FirstChildElement("Bones"); XMLElement *bonesXml = d->FirstChildElement("Bones");
if (bonesXml) if (bonesXml)
@ -1315,7 +1322,7 @@ void SkeletalSprite::loadSkeletal(const std::string &fn)
file = core->adjustFilenameCase(file); file = core->adjustFilenameCase(file);
XMLDocument *xml = _retrieveSkeletalXML(file); XMLDocument *xml = _retrieveSkeletalXML(file, false);
if(!xml) if(!xml)
{ {
filenameLoaded = ""; filenameLoaded = "";