Fixes crash when removing non-existent tokens from XML 'token' nodes

This was SVN commit r11342.
This commit is contained in:
vts 2012-03-15 22:57:08 +00:00
parent c70cbe1e00
commit 31da0a746b
2 changed files with 26 additions and 1 deletions

View File

@ -20,6 +20,7 @@
#include "ParamNode.h"
#include "lib/utf8.h"
#include "ps/CLogger.h"
#include "ps/CStr.h"
#include "ps/Filesystem.h"
#include "ps/XML/Xeromyces.h"
@ -122,10 +123,19 @@ void CParamNode::ApplyLayer(const XMBFile& xmb, const XMBElement& element)
for (size_t i = 0; i < newTokens.size(); ++i)
{
if (newTokens[i][0] == L'-')
tokens.erase(std::find(tokens.begin(), tokens.end(), newTokens[i].substr(1)));
{
std::vector<std::wstring>::iterator tokenIt = std::find(tokens.begin(), tokens.end(), newTokens[i].substr(1));
if (tokenIt != tokens.end())
tokens.erase(tokenIt);
else
LOGWARNING(L"[ParamNode] Could not remove token '%ls' from node '%ls'; not present in list nor inherited (possible typo?)",
newTokens[i].substr(1).c_str(), name.c_str());
}
else
{
if (std::find(oldTokens.begin(), oldTokens.end(), newTokens[i]) == oldTokens.end())
tokens.push_back(newTokens[i]);
}
}
node.m_Value = boost::algorithm::join(tokens, L" ");

View File

@ -117,6 +117,21 @@ public:
TS_ASSERT_WSTR_EQUALS(node.ToXML(), L"<test><a datatype=\"tokens\">x z w</a><b datatype=\"tokens\">a b c d</b><c datatype=\"tokens\">n o</c></test>");
}
void test_overlay_remove_nonexistent_token()
{
// regression test; this used to cause a crash because of a failure to check whether the token being removed was present
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, "<test> <a datatype='tokens'>-nonexistenttoken X</a></test>"), PSRETURN_OK);
TS_ASSERT_WSTR_EQUALS(node.ToXML(), L"<test><a datatype=\"tokens\">X</a></test>");
}
void test_overlay_remove_empty_token()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, "<test> <a datatype='tokens'> Y - X </a></test>"), PSRETURN_OK);
TS_ASSERT_WSTR_EQUALS(node.ToXML(), L"<test><a datatype=\"tokens\">Y X</a></test>");
}
void test_types()
{
CParamNode node;