| Index: third_party/libxml/SAX2.c
|
| diff --git a/third_party/libxml/SAX2.c b/third_party/libxml/SAX2.c
|
| index 7dbc2b2229938331bb672dcb1c5c25a92eacbc0e..84c1f00481cb2581c9be56ab0b5099713aaf9a88 100644
|
| --- a/third_party/libxml/SAX2.c
|
| +++ b/third_party/libxml/SAX2.c
|
| @@ -11,6 +11,7 @@
|
| #include "libxml.h"
|
| #include <stdlib.h>
|
| #include <string.h>
|
| +#include <limits.h>
|
| #include <libxml/xmlmemory.h>
|
| #include <libxml/tree.h>
|
| #include <libxml/parser.h>
|
| @@ -26,6 +27,11 @@
|
| #include <libxml/HTMLtree.h>
|
| #include <libxml/globals.h>
|
|
|
| +/* Define SIZE_T_MAX unless defined through <limits.h>. */
|
| +#ifndef SIZE_T_MAX
|
| +# define SIZE_T_MAX ((size_t)-1)
|
| +#endif /* !SIZE_T_MAX */
|
| +
|
| /* #define DEBUG_SAX2 */
|
| /* #define DEBUG_SAX2_TREE */
|
|
|
| @@ -580,7 +586,8 @@ xmlSAX2GetEntity(void *ctx, const xmlChar *name)
|
| return(NULL);
|
| }
|
| ret->owner = 1;
|
| - ret->checked = 1;
|
| + if (ret->checked == 0)
|
| + ret->checked = 1;
|
| }
|
| return(ret);
|
| }
|
| @@ -957,6 +964,8 @@ xmlSAX2StartDocument(void *ctx)
|
| #ifdef LIBXML_HTML_ENABLED
|
| if (ctxt->myDoc == NULL)
|
| ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL);
|
| + ctxt->myDoc->properties = XML_DOC_HTML;
|
| + ctxt->myDoc->parseFlags = ctxt->options;
|
| if (ctxt->myDoc == NULL) {
|
| xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument");
|
| return;
|
| @@ -972,6 +981,10 @@ xmlSAX2StartDocument(void *ctx)
|
| } else {
|
| doc = ctxt->myDoc = xmlNewDoc(ctxt->version);
|
| if (doc != NULL) {
|
| + doc->properties = 0;
|
| + if (ctxt->options & XML_PARSE_OLD10)
|
| + doc->properties |= XML_DOC_OLD10;
|
| + doc->parseFlags = ctxt->options;
|
| if (ctxt->encoding != NULL)
|
| doc->encoding = xmlStrdup(ctxt->encoding);
|
| else
|
| @@ -1092,24 +1105,33 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
|
| return;
|
| }
|
|
|
| +#ifdef LIBXML_HTML_ENABLED
|
| + if ((ctxt->html) &&
|
| + (value == NULL) && (htmlIsBooleanAttr(fullname))) {
|
| + nval = xmlStrdup(fullname);
|
| + value = (const xmlChar *) nval;
|
| + } else
|
| +#endif
|
| + {
|
| #ifdef LIBXML_VALID_ENABLED
|
| - /*
|
| - * Do the last stage of the attribute normalization
|
| - * Needed for HTML too:
|
| - * http://www.w3.org/TR/html4/types.html#h-6.2
|
| - */
|
| - ctxt->vctxt.valid = 1;
|
| - nval = xmlValidCtxtNormalizeAttributeValue(&ctxt->vctxt,
|
| - ctxt->myDoc, ctxt->node,
|
| - fullname, value);
|
| - if (ctxt->vctxt.valid != 1) {
|
| - ctxt->valid = 0;
|
| - }
|
| - if (nval != NULL)
|
| - value = nval;
|
| + /*
|
| + * Do the last stage of the attribute normalization
|
| + * Needed for HTML too:
|
| + * http://www.w3.org/TR/html4/types.html#h-6.2
|
| + */
|
| + ctxt->vctxt.valid = 1;
|
| + nval = xmlValidCtxtNormalizeAttributeValue(&ctxt->vctxt,
|
| + ctxt->myDoc, ctxt->node,
|
| + fullname, value);
|
| + if (ctxt->vctxt.valid != 1) {
|
| + ctxt->valid = 0;
|
| + }
|
| + if (nval != NULL)
|
| + value = nval;
|
| #else
|
| - nval = NULL;
|
| + nval = NULL;
|
| #endif /* LIBXML_VALID_ENABLED */
|
| + }
|
|
|
| /*
|
| * Check whether it's a namespace definition
|
| @@ -1233,30 +1255,32 @@ xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname,
|
| }
|
|
|
| if (ns != NULL) {
|
| - xmlAttrPtr prop;
|
| namespace = xmlSearchNs(ctxt->myDoc, ctxt->node, ns);
|
| +
|
| if (namespace == NULL) {
|
| xmlNsErrMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE,
|
| "Namespace prefix %s of attribute %s is not defined\n",
|
| ns, name);
|
| - }
|
| -
|
| - prop = ctxt->node->properties;
|
| - while (prop != NULL) {
|
| - if (prop->ns != NULL) {
|
| - if ((xmlStrEqual(name, prop->name)) &&
|
| - ((namespace == prop->ns) ||
|
| - (xmlStrEqual(namespace->href, prop->ns->href)))) {
|
| - xmlNsErrMsg(ctxt, XML_ERR_ATTRIBUTE_REDEFINED,
|
| - "Attribute %s in %s redefined\n",
|
| - name, namespace->href);
|
| - ctxt->wellFormed = 0;
|
| - if (ctxt->recovery == 0) ctxt->disableSAX = 1;
|
| - goto error;
|
| - }
|
| - }
|
| - prop = prop->next;
|
| - }
|
| + } else {
|
| + xmlAttrPtr prop;
|
| +
|
| + prop = ctxt->node->properties;
|
| + while (prop != NULL) {
|
| + if (prop->ns != NULL) {
|
| + if ((xmlStrEqual(name, prop->name)) &&
|
| + ((namespace == prop->ns) ||
|
| + (xmlStrEqual(namespace->href, prop->ns->href)))) {
|
| + xmlNsErrMsg(ctxt, XML_ERR_ATTRIBUTE_REDEFINED,
|
| + "Attribute %s in %s redefined\n",
|
| + name, namespace->href);
|
| + ctxt->wellFormed = 0;
|
| + if (ctxt->recovery == 0) ctxt->disableSAX = 1;
|
| + goto error;
|
| + }
|
| + }
|
| + prop = prop->next;
|
| + }
|
| + }
|
| } else {
|
| namespace = NULL;
|
| }
|
| @@ -1407,6 +1431,10 @@ process_external_subset:
|
| } else {
|
| fulln = xmlStrdup(attr->name);
|
| }
|
| + if (fulln == NULL) {
|
| + xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement");
|
| + break;
|
| + }
|
|
|
| /*
|
| * Check that the attribute is not declared in the
|
| @@ -1429,6 +1457,7 @@ process_external_subset:
|
| (const char *)fulln,
|
| (const char *)attr->elem);
|
| }
|
| + xmlFree(fulln);
|
| }
|
| attr = attr->nexth;
|
| }
|
| @@ -1837,6 +1866,9 @@ skip:
|
| } else
|
| ret->content = (xmlChar *) intern;
|
|
|
| + if (ctxt->input != NULL)
|
| + ret->line = ctxt->input->line;
|
| +
|
| if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
|
| xmlRegisterNodeDefaultValue(ret);
|
| return(ret);
|
| @@ -2262,9 +2294,14 @@ xmlSAX2StartElementNs(void *ctx,
|
| xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs");
|
| return;
|
| }
|
| - xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE,
|
| - "Namespace prefix %s was not found\n",
|
| - prefix, NULL);
|
| + if (prefix != NULL)
|
| + xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE,
|
| + "Namespace prefix %s was not found\n",
|
| + prefix, NULL);
|
| + else
|
| + xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE,
|
| + "Namespace default prefix was not found\n",
|
| + NULL, NULL);
|
| }
|
| }
|
|
|
| @@ -2445,9 +2482,19 @@ xmlSAX2Characters(void *ctx, const xmlChar *ch, int len)
|
| (xmlDictOwns(ctxt->dict, lastChild->content))) {
|
| lastChild->content = xmlStrdup(lastChild->content);
|
| }
|
| + if (((size_t)ctxt->nodelen + (size_t)len > XML_MAX_TEXT_LENGTH) &&
|
| + ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
| + xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters: huge text node");
|
| + return;
|
| + }
|
| + if ((size_t)ctxt->nodelen > SIZE_T_MAX - (size_t)len ||
|
| + (size_t)ctxt->nodemem + (size_t)len > SIZE_T_MAX / 2) {
|
| + xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters overflow prevented");
|
| + return;
|
| + }
|
| if (ctxt->nodelen + len >= ctxt->nodemem) {
|
| xmlChar *newbuf;
|
| - int size;
|
| + size_t size;
|
|
|
| size = ctxt->nodemem + len;
|
| size *= 2;
|
| @@ -2528,7 +2575,6 @@ xmlSAX2ProcessingInstruction(void *ctx, const xmlChar *target,
|
|
|
| ret = xmlNewDocPI(ctxt->myDoc, target, data);
|
| if (ret == NULL) return;
|
| - parent = ctxt->node;
|
|
|
| if (ctxt->linenumbers) {
|
| if (ctxt->input != NULL) {
|
|
|