From 21e86623a0a319e62268fa309f9dc11c8ff706c9 Mon Sep 17 00:00:00 2001 From: Scott Cantor Date: Thu, 9 Aug 2007 19:38:55 +0000 Subject: [PATCH] Fix bugs in exception serializer. --- xmltooling/exceptions.cpp | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/xmltooling/exceptions.cpp b/xmltooling/exceptions.cpp index 91f4ffa..4b15451 100644 --- a/xmltooling/exceptions.cpp +++ b/xmltooling/exceptions.cpp @@ -217,14 +217,40 @@ const char* XMLToolingException::getMessage() const return m_processedmsg.c_str(); } +void xml_encode(string& s, const char* pre, const char* start, const char* post) +{ + s += pre; + size_t pos; + while (start && *start) { + pos = strcspn(start, "\"<>&"); + if (pos > 0) { + s.append(start, pos); + start += pos; + } + else { + switch (*start) { + case '\'': s += "'"; break; + case '<': s += "<"; break; + case '>': s += ">"; break; + case '&': s += "&"; break; + default: s += *start; + } + start++; + } + } + s += post; +} + string XMLToolingException::toString() const { - string xml=string(""; + string xml=string(""; const char* msg=getMessage(); if (msg) - xml=xml + "" + msg + ""; - for (map::const_iterator i=m_params.begin(); i!=m_params.end(); i++) - xml=xml + "first + "\">" + i->second + ""; + xml_encode(xml, "", msg, ""); + for (map::const_iterator i=m_params.begin(); i!=m_params.end(); i++) { + xml_encode(xml, "", i->second.c_str(), ""); + } xml+=""; return xml; } @@ -273,8 +299,8 @@ XMLToolingException* XMLToolingException::fromStream(std::istream& in) char* v=toUTF8(child->getFirstChild()->getNodeValue()); if (n.get() && v) excep->addProperty(n.get(), v); - XMLString::release(&v); - child=XMLHelper::getNextSiblingElement(root,XMLTOOLING_NS,param); + delete[] v; + child=XMLHelper::getNextSiblingElement(child,XMLTOOLING_NS,param); } doc->release(); -- 2.1.4