summaryrefslogtreecommitdiffstats
path: root/clang/lib/Index/CommentToXML.cpp
diff options
context:
space:
mode:
authorDmitri Gribenko <gribozavr@gmail.com>2014-04-22 12:34:52 +0000
committerDmitri Gribenko <gribozavr@gmail.com>2014-04-22 12:34:52 +0000
commit6db07e2ab71ea1d15ce2f5338da6ccc4b29293c4 (patch)
tree05053213c4197cf955998993aa98dd1d4ce6de97 /clang/lib/Index/CommentToXML.cpp
parent64f6ebb8a957d14b6113843968f9541bab826f18 (diff)
downloadbcm5719-llvm-6db07e2ab71ea1d15ce2f5338da6ccc4b29293c4.tar.gz
bcm5719-llvm-6db07e2ab71ea1d15ce2f5338da6ccc4b29293c4.zip
Comment parsing: close a hole in CDATA escaping in XML output
llvm-svn: 206886
Diffstat (limited to 'clang/lib/Index/CommentToXML.cpp')
-rw-r--r--clang/lib/Index/CommentToXML.cpp36
1 files changed, 33 insertions, 3 deletions
diff --git a/clang/lib/Index/CommentToXML.cpp b/clang/lib/Index/CommentToXML.cpp
index 377440f81d5..4f5c0745d72 100644
--- a/clang/lib/Index/CommentToXML.cpp
+++ b/clang/lib/Index/CommentToXML.cpp
@@ -563,6 +563,7 @@ public:
// Helpers.
void appendToResultWithXMLEscaping(StringRef S);
+ void appendToResultWithCDATAEscaping(StringRef S);
void formatTextOfDeclaration(const DeclInfo *DI,
SmallString<128> &Declaration);
@@ -670,9 +671,16 @@ void CommentASTToXMLConverter::visitHTMLStartTagComment(
Result << "<rawHTML";
if (C->isSafeToPassThrough())
Result << " isSafeToPassThrough=\"1\"";
- Result << "><![CDATA[";
- printHTMLStartTagComment(C, Result);
- Result << "]]></rawHTML>";
+ Result << ">";
+ {
+ SmallString<32> Tag;
+ {
+ llvm::raw_svector_ostream TagOS(Tag);
+ printHTMLStartTagComment(C, TagOS);
+ }
+ appendToResultWithCDATAEscaping(Tag);
+ }
+ Result << "</rawHTML>";
}
void
@@ -1106,6 +1114,28 @@ void CommentASTToXMLConverter::appendToResultWithXMLEscaping(StringRef S) {
}
}
+void CommentASTToXMLConverter::appendToResultWithCDATAEscaping(StringRef S) {
+ if (S.empty())
+ return;
+
+ Result << "<![CDATA[";
+ while (!S.empty()) {
+ size_t Pos = S.find("]]>");
+ if (Pos == 0) {
+ Result << "]]]]><![CDATA[>";
+ S = S.drop_front(3);
+ continue;
+ }
+ if (Pos == StringRef::npos)
+ Pos = S.size();
+
+ Result << S.substr(0, Pos);
+
+ S = S.drop_front(Pos);
+ }
+ Result << "]]>";
+}
+
void CommentToXMLConverter::convertCommentToHTML(const FullComment *FC,
SmallVectorImpl<char> &HTML,
const ASTContext &Context) {
OpenPOWER on IntegriCloud