| diff --git a/parser.c b/parser.c |
| index 072eb22d..f863edd1 100644 |
| --- a/parser.c |
| +++ b/parser.c |
| @@ -96,12 +96,6 @@ xmlCreateEntityParserCtxtInternal(const xmlChar *URL, const xmlChar *ID, |
| |
| static void xmlHaltParser(xmlParserCtxtPtr ctxt); |
| |
| -static int |
| -xmlParseElementStart(xmlParserCtxtPtr ctxt); |
| - |
| -static void |
| -xmlParseElementEnd(xmlParserCtxtPtr ctxt); |
| - |
| /************************************************************************ |
| * * |
| * Arbitrary limits set in the parser. See XML_PARSE_HUGE * |
| @@ -1828,6 +1822,7 @@ nodePop(xmlParserCtxtPtr ctxt) |
| return (ret); |
| } |
| |
| +#ifdef LIBXML_PUSH_ENABLED |
| /** |
| * nameNsPush: |
| * @ctxt: an XML parser context |
| @@ -1863,11 +1858,6 @@ nameNsPush(xmlParserCtxtPtr ctxt, const xmlChar * value, |
| goto mem_error; |
| } |
| ctxt->pushTab = tmp2; |
| - } else if (ctxt->pushTab == NULL) { |
| - ctxt->pushTab = (void **) xmlMalloc(ctxt->nameMax * 3 * |
| - sizeof(ctxt->pushTab[0])); |
| - if (ctxt->pushTab == NULL) |
| - goto mem_error; |
| } |
| ctxt->nameTab[ctxt->nameNr] = value; |
| ctxt->name = value; |
| @@ -1879,7 +1869,6 @@ mem_error: |
| xmlErrMemory(ctxt, NULL); |
| return (-1); |
| } |
| -#ifdef LIBXML_PUSH_ENABLED |
| /** |
| * nameNsPop: |
| * @ctxt: an XML parser context |
| @@ -9812,10 +9801,9 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) { |
| |
| void |
| xmlParseContent(xmlParserCtxtPtr ctxt) { |
| - int nameNr = ctxt->nameNr; |
| - |
| GROW; |
| while ((RAW != 0) && |
| + ((RAW != '<') || (NXT(1) != '/')) && |
| (ctxt->instate != XML_PARSER_EOF)) { |
| const xmlChar *test = CUR_PTR; |
| unsigned int cons = ctxt->input->consumed; |
| @@ -9849,13 +9837,7 @@ xmlParseContent(xmlParserCtxtPtr ctxt) { |
| * Fourth case : a sub-element. |
| */ |
| else if (*cur == '<') { |
| - if (NXT(1) == '/') { |
| - if (ctxt->nameNr <= nameNr) |
| - break; |
| - xmlParseElementEnd(ctxt); |
| - } else { |
| - xmlParseElementStart(ctxt); |
| - } |
| + xmlParseElement(ctxt); |
| } |
| |
| /* |
| @@ -9890,7 +9872,7 @@ xmlParseContent(xmlParserCtxtPtr ctxt) { |
| * xmlParseElement: |
| * @ctxt: an XML parser context |
| * |
| - * parse an XML element |
| + * parse an XML element, this is highly recursive |
| * |
| * [39] element ::= EmptyElemTag | STag content ETag |
| * |
| @@ -9902,23 +9884,6 @@ xmlParseContent(xmlParserCtxtPtr ctxt) { |
| |
| void |
| xmlParseElement(xmlParserCtxtPtr ctxt) { |
| - if (xmlParseElementStart(ctxt) != 0) |
| - return; |
| - xmlParseContent(ctxt); |
| - if (ctxt->instate == XML_PARSER_EOF) |
| - return; |
| - xmlParseElementEnd(ctxt); |
| -} |
| - |
| -/** |
| - * xmlParseElementStart: |
| - * @ctxt: an XML parser context |
| - * |
| - * Parse the start of an XML element. Returns -1 in case of error, 0 if an |
| - * opening tag was parsed, 1 if an empty element was parsed. |
| - */ |
| -static int |
| -xmlParseElementStart(xmlParserCtxtPtr ctxt) { |
| const xmlChar *name; |
| const xmlChar *prefix = NULL; |
| const xmlChar *URI = NULL; |
| @@ -9933,7 +9898,7 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) { |
| "Excessive depth in document: %d use XML_PARSE_HUGE option\n", |
| xmlParserMaxDepth); |
| xmlHaltParser(ctxt); |
| - return(-1); |
| + return; |
| } |
| |
| /* Capture start position */ |
| @@ -9960,17 +9925,12 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) { |
| name = xmlParseStartTag(ctxt); |
| #endif /* LIBXML_SAX1_ENABLED */ |
| if (ctxt->instate == XML_PARSER_EOF) |
| - return(-1); |
| + return; |
| if (name == NULL) { |
| spacePop(ctxt); |
| - return(-1); |
| + return; |
| } |
| - if (ctxt->sax2) |
| - nameNsPush(ctxt, name, prefix, URI, ctxt->nsNr - nsNr); |
| -#ifdef LIBXML_SAX1_ENABLED |
| - else |
| - namePush(ctxt, name); |
| -#endif /* LIBXML_SAX1_ENABLED */ |
| + namePush(ctxt, name); |
| ret = ctxt->node; |
| |
| #ifdef LIBXML_VALID_ENABLED |
| @@ -10011,7 +9971,7 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) { |
| node_info.node = ret; |
| xmlParserAddNodeInfo(ctxt, &node_info); |
| } |
| - return(1); |
| + return; |
| } |
| if (RAW == '>') { |
| NEXT1; |
| @@ -10039,39 +9999,41 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) { |
| node_info.node = ret; |
| xmlParserAddNodeInfo(ctxt, &node_info); |
| } |
| - return(-1); |
| + return; |
| } |
| |
| - return(0); |
| -} |
| - |
| -/** |
| - * xmlParseElementEnd: |
| - * @ctxt: an XML parser context |
| - * |
| - * Parse the end of an XML element. |
| - */ |
| -static void |
| -xmlParseElementEnd(xmlParserCtxtPtr ctxt) { |
| - xmlParserNodeInfo node_info; |
| - xmlNodePtr ret = ctxt->node; |
| + /* |
| + * Parse the content of the element: |
| + */ |
| + xmlParseContent(ctxt); |
| + if (ctxt->instate == XML_PARSER_EOF) |
| + return; |
| + if (!IS_BYTE_CHAR(RAW)) { |
| + xmlFatalErrMsgStrIntStr(ctxt, XML_ERR_TAG_NOT_FINISHED, |
| + "Premature end of data in tag %s line %d\n", |
| + name, line, NULL); |
| |
| - if (ctxt->nameNr <= 0) |
| - return; |
| + /* |
| + * end of parsing of this node. |
| + */ |
| + nodePop(ctxt); |
| + namePop(ctxt); |
| + spacePop(ctxt); |
| + if (nsNr != ctxt->nsNr) |
| + nsPop(ctxt, ctxt->nsNr - nsNr); |
| + return; |
| + } |
| |
| /* |
| * parse the end of tag: '</' should be here. |
| */ |
| if (ctxt->sax2) { |
| - const xmlChar *prefix = ctxt->pushTab[ctxt->nameNr * 3 - 3]; |
| - const xmlChar *URI = ctxt->pushTab[ctxt->nameNr * 3 - 2]; |
| - int nsNr = (ptrdiff_t) ctxt->pushTab[ctxt->nameNr * 3 - 1]; |
| - xmlParseEndTag2(ctxt, prefix, URI, 0, nsNr, 0); |
| + xmlParseEndTag2(ctxt, prefix, URI, line, ctxt->nsNr - nsNr, tlen); |
| namePop(ctxt); |
| } |
| #ifdef LIBXML_SAX1_ENABLED |
| - else |
| - xmlParseEndTag1(ctxt, 0); |
| + else |
| + xmlParseEndTag1(ctxt, line); |
| #endif /* LIBXML_SAX1_ENABLED */ |
| |
| /* |
| @@ -12388,6 +12350,13 @@ xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, void *user_data, |
| return(NULL); |
| } |
| ctxt->dictNames = 1; |
| + ctxt->pushTab = (void **) xmlMalloc(ctxt->nameMax * 3 * sizeof(xmlChar *)); |
| + if (ctxt->pushTab == NULL) { |
| + xmlErrMemory(ctxt, NULL); |
| + xmlFreeParserInputBuffer(buf); |
| + xmlFreeParserCtxt(ctxt); |
| + return(NULL); |
| + } |
| if (sax != NULL) { |
| #ifdef LIBXML_SAX1_ENABLED |
| if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler) |
| @@ -14835,6 +14804,16 @@ xmlCtxtResetPush(xmlParserCtxtPtr ctxt, const char *chunk, |
| |
| xmlCtxtReset(ctxt); |
| |
| + if (ctxt->pushTab == NULL) { |
| + ctxt->pushTab = (void **) xmlMalloc(ctxt->nameMax * 3 * |
| + sizeof(xmlChar *)); |
| + if (ctxt->pushTab == NULL) { |
| + xmlErrMemory(ctxt, NULL); |
| + xmlFreeParserInputBuffer(buf); |
| + return(1); |
| + } |
| + } |
| + |
| if (filename == NULL) { |
| ctxt->directory = NULL; |
| } else { |
| diff --git a/result/errors/754947.xml.err b/result/errors/754947.xml.err |
| index 51e9b4ed..f45cb5a2 100644 |
| --- a/result/errors/754947.xml.err |
| +++ b/result/errors/754947.xml.err |
| @@ -2,6 +2,6 @@ |
| Bytes: 0xEE 0x5D 0x5D 0x3E |
| <d><![CDATA[0000000000000î]]> |
| ^ |
| -./test/errors/754947.xml:1: parser error : EndTag: '</' not found |
| +./test/errors/754947.xml:1: parser error : Premature end of data in tag d line 1 |
| <d><![CDATA[0000000000000î]]> |
| ^ |
| diff --git a/result/errors/759398.xml.err b/result/errors/759398.xml.err |
| index bc9e5e03..f6036a3b 100644 |
| --- a/result/errors/759398.xml.err |
| +++ b/result/errors/759398.xml.err |
| @@ -1,10 +1,10 @@ |
| ./test/errors/759398.xml:210: parser error : StartTag: invalid element name |
| need to worry about parsers whi<! don't expand PErefs finding |
| ^ |
| -./test/errors/759398.xml:309: parser error : Opening and ending tag mismatch: âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââm line 205 and termdef |
| +./test/errors/759398.xml:309: parser error : Opening and ending tag mismatch: âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââm line 308 and termdef |
| and provide access to their content and structure.</termdef> <termdef |
| ^ |
| -./test/errors/759398.xml:314: parser error : Opening and ending tag mismatch: spec line 205 and p |
| +./test/errors/759398.xml:314: parser error : Opening and ending tag mismatch: spec line 50 and p |
| data and the information it must provide to the application.</p> |
| ^ |
| ./test/errors/759398.xml:316: parser error : Extra content at the end of the document |