diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2014-04-22 12:34:52 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2014-04-22 12:34:52 +0000 |
commit | 6db07e2ab71ea1d15ce2f5338da6ccc4b29293c4 (patch) | |
tree | 05053213c4197cf955998993aa98dd1d4ce6de97 /clang/lib/Index/CommentToXML.cpp | |
parent | 64f6ebb8a957d14b6113843968f9541bab826f18 (diff) | |
download | bcm5719-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.cpp | 36 |
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) { |