aboutsummaryrefslogtreecommitdiff
path: root/src/xml/SkXMLParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/xml/SkXMLParser.cpp')
-rw-r--r--src/xml/SkXMLParser.cpp58
1 files changed, 35 insertions, 23 deletions
diff --git a/src/xml/SkXMLParser.cpp b/src/xml/SkXMLParser.cpp
index eab28cb9f6..5d3526a7c9 100644
--- a/src/xml/SkXMLParser.cpp
+++ b/src/xml/SkXMLParser.cpp
@@ -154,29 +154,41 @@ bool SkXMLParser::parse(SkStream& docStream)
// Disable entity processing, to inhibit internal entity expansion. See expat CVE-2013-0340.
XML_SetEntityDeclHandler(ctx.fXMLParser, entity_decl_handler);
- static constexpr int kBufferSize = 4096;
- bool done = false;
- do {
- void* buffer = XML_GetBuffer(ctx.fXMLParser, kBufferSize);
- if (!buffer) {
- SkDEBUGF("could not buffer enough to continue\n");
- return false;
- }
-
- size_t len = docStream.read(buffer, kBufferSize);
- done = docStream.isAtEnd();
- XML_Status status = XML_ParseBuffer(ctx.fXMLParser, SkToS32(len), done);
- if (XML_STATUS_ERROR == status) {
- #if defined(SK_DEBUG)
- XML_Error error = XML_GetErrorCode(ctx.fXMLParser);
- int line = XML_GetCurrentLineNumber(ctx.fXMLParser);
- int column = XML_GetCurrentColumnNumber(ctx.fXMLParser);
- const XML_LChar* errorString = XML_ErrorString(error);
- SkDEBUGF("parse error @%d:%d: %d (%s).\n", line, column, error, errorString);
- #endif
- return false;
- }
- } while (!done);
+ XML_Status status = XML_STATUS_OK;
+ if (docStream.getMemoryBase() && docStream.hasLength()) {
+ const char* base = reinterpret_cast<const char*>(docStream.getMemoryBase());
+ status = XML_Parse(ctx.fXMLParser,
+ base + docStream.getPosition(),
+ docStream.getLength() - docStream.getPosition(),
+ true);
+ } else {
+ static constexpr int kBufferSize = 4096;
+ bool done = false;
+ do {
+ void* buffer = XML_GetBuffer(ctx.fXMLParser, kBufferSize);
+ if (!buffer) {
+ SkDEBUGF("could not buffer enough to continue\n");
+ return false;
+ }
+
+ size_t len = docStream.read(buffer, kBufferSize);
+ done = docStream.isAtEnd();
+ status = XML_ParseBuffer(ctx.fXMLParser, SkToS32(len), done);
+ if (XML_STATUS_ERROR == status) {
+ break;
+ }
+ } while (!done);
+ }
+ if (XML_STATUS_ERROR == status) {
+#if defined(SK_DEBUG)
+ XML_Error error = XML_GetErrorCode(ctx.fXMLParser);
+ int line = XML_GetCurrentLineNumber(ctx.fXMLParser);
+ int column = XML_GetCurrentColumnNumber(ctx.fXMLParser);
+ const XML_LChar* errorString = XML_ErrorString(error);
+ SkDEBUGF("parse error @%d:%d: %d (%s).\n", line, column, error, errorString);
+#endif
+ return false;
+ }
return true;
}