From e979abd6ccc120cddcef11e535607462b6bc2adc Mon Sep 17 00:00:00 2001 From: Vojtech Bocek Date: Mon, 12 Jan 2015 18:29:12 +0100 Subject: Fix some crashes during theme (re)loading Change-Id: I01405fbe86a48ae79f2cbe633b89f2dcfb1ef266 Signed-off-by: Vojtech Bocek --- gui/action.cpp | 7 +++---- gui/pages.cpp | 36 +++++++++++++++++++++++++----------- gui/pages.hpp | 1 + 3 files changed, 29 insertions(+), 15 deletions(-) (limited to 'gui') diff --git a/gui/action.cpp b/gui/action.cpp index c298d02af..8ea1dae82 100644 --- a/gui/action.cpp +++ b/gui/action.cpp @@ -385,8 +385,9 @@ int GUIAction::doActions() } else { - for (it = mActions.begin(); it != mActions.end(); ++it) - doAction(*it); + const size_t cnt = mActions.size(); + for (size_t i = 0; i < cnt; ++i) + doAction(mActions[i]); } return 0; @@ -484,7 +485,6 @@ int GUIAction::reload(std::string arg) int check = 0, ret_val = 0; std::string theme_path; - operation_start("Reload Theme"); theme_path = DataManager::GetSettingsStoragePath(); if (PartitionManager.Mount_By_Path(theme_path.c_str(), 1) < 0) { LOGERR("Unable to mount %s during reload function startup.\n", theme_path.c_str()); @@ -502,7 +502,6 @@ int GUIAction::reload(std::string arg) ret_val = 1; } } - operation_end(ret_val); return 0; } diff --git a/gui/pages.cpp b/gui/pages.cpp index aae85aec9..94c351be2 100644 --- a/gui/pages.cpp +++ b/gui/pages.cpp @@ -557,11 +557,16 @@ PageSet::~PageSet() { for (std::vector::iterator itr = mPages.begin(); itr != mPages.end(); ++itr) delete *itr; - for (std::vector*>::iterator itr2 = templates.begin(); itr2 != templates.end(); ++itr2) - delete *itr2; delete mResources; free(mXmlFile); + + mDoc.clear(); + + for (std::vector*>::iterator itr = mIncludedDocs.begin(); itr != mIncludedDocs.end(); ++itr) { + (*itr)->clear(); + delete *itr; + } } int PageSet::Load(ZipArchive* package) @@ -605,7 +610,7 @@ int PageSet::Load(ZipArchive* package) return -1; } } - + return CheckInclude(package, &mDoc); } @@ -620,7 +625,7 @@ int PageSet::CheckInclude(ZipArchive* package, xml_document<> *parentDoc) long len; char* xmlFile = NULL; string filename; - xml_document<> doc; + xml_document<> *doc = NULL; par = parentDoc->first_node("recovery"); if (!par) { @@ -682,11 +687,14 @@ int PageSet::CheckInclude(ZipArchive* package, xml_document<> *parentDoc) return -1; } } - doc.parse<0>(xmlFile); - parent = doc.first_node("recovery"); + xmlFile[len] = '\0'; + doc = new xml_document<>(); + doc->parse<0>(xmlFile); + + parent = doc->first_node("recovery"); if (!parent) - parent = doc.first_node("install"); + parent = doc->first_node("install"); // Now, let's parse the XML LOGINFO("Loading included resources...\n"); @@ -711,11 +719,17 @@ int PageSet::CheckInclude(ZipArchive* package, xml_document<> *parentDoc) templates.push_back(xmltemplate); child = parent->first_node("pages"); - if (child) - if (LoadPages(child)) - return -1; + if (child && LoadPages(child)) + { + templates.pop_back(); + doc->clear(); + delete doc; + return -1; + } + + mIncludedDocs.push_back(doc); - if (CheckInclude(package, &doc)) + if (CheckInclude(package, doc)) return -1; chld = chld->next_sibling("xmlfile"); diff --git a/gui/pages.hpp b/gui/pages.hpp index 2ce3e13a4..b042c0db8 100644 --- a/gui/pages.hpp +++ b/gui/pages.hpp @@ -111,6 +111,7 @@ protected: std::vector*> templates; Page* mCurrentPage; Page* mOverlayPage; // This is a special case, used for "locking" the screen + std::vector*> mIncludedDocs; }; class PageManager -- cgit v1.2.3