Permalink
Browse files

Fix crashes caused by poor iterator usage.

  • Loading branch information...
1 parent 183e7db commit 46a5f608db8f552568b545e13acaf426c44ecd2a @Deledrius committed Apr 17, 2012
Showing with 25 additions and 17 deletions.
  1. +25 −17 Sources/Plasma/FeatureLib/pfLocalizationMgr/pfLocalizationDataMgr.cpp
@@ -599,8 +599,9 @@ void LocalizationDatabase::IVerifyElement(const std::wstring &ageName, const std
std::wstring elementName = curElement->first;
LocalizationXMLFile::element& theElement = curElement->second;
- LocalizationXMLFile::element::iterator curTranslation;
- for (curTranslation = theElement.begin(); curTranslation != theElement.end(); curTranslation++)
+ LocalizationXMLFile::element::iterator curTranslation = theElement.begin();
+
+ while (curTranslation != theElement.end())
{
// Make sure this language exists!
bool languageExists = false;
@@ -612,25 +613,17 @@ void LocalizationDatabase::IVerifyElement(const std::wstring &ageName, const std
break;
}
}
+
if (!languageExists)
{
fErrorString += L"ERROR: The language " + curTranslation->first + L" used by " + ageName + L"." + setName + L".";
fErrorString += elementName + L" is not supported, discarding translation\n";
- theElement.erase(curTranslation);
- curTranslation--; // because this will be incremented on the next run through the loop
- continue;
+ curTranslation = theElement.erase(curTranslation);
}
+ else
+ curTranslation++;
}
- LocalizationXMLFile::set& theSet = fData[ageName][setName];
- if (theElement.find(defaultLanguage) == theElement.end())
- {
- fErrorString += L"ERROR: Default language " + defaultLanguage + L" is missing from the translations in element ";
- fErrorString += ageName + L"." + setName + L"." + elementName + L", deleting element\n";
- theSet.erase(curElement);
- curElement--;
- return;
- }
for (int i = 1; i < languageNames.size(); i++)
{
if (theElement.find(languageNames[i]) == theElement.end())
@@ -646,9 +639,24 @@ void LocalizationDatabase::IVerifyElement(const std::wstring &ageName, const std
void LocalizationDatabase::IVerifySet(const std::wstring &ageName, const std::wstring &setName)
{
LocalizationXMLFile::set& theSet = fData[ageName][setName];
- LocalizationXMLFile::set::iterator curElement;
- for (curElement = theSet.begin(); curElement != theSet.end(); curElement++)
- IVerifyElement(ageName, setName, curElement);
+ LocalizationXMLFile::set::iterator curElement = theSet.begin();
+ std::wstring defaultLanguage = hsStringToWString(plLocalization::GetLanguageName((plLocalization::Language)0));
+
+ while (curElement != theSet.end())
+ {
+ // Check that we at least have a default language translation for fallback
+ if (curElement->second.find(defaultLanguage) == curElement->second.end())
+ {
+ fErrorString += L"ERROR: Default language " + defaultLanguage + L" is missing from the translations in element ";
+ fErrorString += ageName + L"." + setName + L"." + curElement->first + L", deleting element\n";
+ curElement = theSet.erase(curElement);
+ }
+ else
+ {
+ IVerifyElement(ageName, setName, curElement);
+ curElement++;
+ }
+ }
}
//// IVerifyAge() ////////////////////////////////////////////////////

0 comments on commit 46a5f60

Please sign in to comment.