forked from 0ad/0ad
Fixes crash when removing non-existent tokens from XML 'token' nodes
This was SVN commit r11342.
This commit is contained in:
parent
c70cbe1e00
commit
31da0a746b
@ -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" ");
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user