diff --git a/Makefile.am b/Makefile.am index 6fc8ffa9..10e716a5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -427,6 +427,24 @@ Errtests : xmllint$(EXEEXT) if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) + @echo "## Error cases regression tests (old 1.0)" + -@(for i in $(srcdir)/test/errors10/*.xml ; do \ + name=`basename $$i`; \ + if [ ! -d $$i ] ; then \ + if [ ! -f $(srcdir)/result/errors10/$$name ] ; then \ + echo New test file $$name ; \ + $(CHECKER) $(top_builddir)/xmllint --oldxml10 $$i \ + 2> $(srcdir)/result/errors10/$$name.err \ + > $(srcdir)/result/errors10/$$name ; \ + grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ + else \ + log=`$(CHECKER) $(top_builddir)/xmllint --oldxml10 $$i 2> error.$$name > result.$$name ; \ + grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ + diff $(srcdir)/result/errors10/$$name result.$$name ; \ + diff $(srcdir)/result/errors10/$$name.err error.$$name` ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ + rm result.$$name error.$$name ; \ + fi ; fi ; done) @echo "## Error cases stream regression tests" -@(for i in $(srcdir)/test/errors/*.xml ; do \ name=`basename $$i`; \ diff --git a/parser.c b/parser.c index df2efa55..a175ac4e 100644 --- a/parser.c +++ b/parser.c @@ -2121,7 +2121,6 @@ static void xmlGROW (xmlParserCtxtPtr ctxt) { ctxt->input->line++; ctxt->input->col = 1; \ } else ctxt->input->col++; \ ctxt->input->cur += l; \ - if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ } while (0) #define CUR_CHAR(l) xmlCurrentChar(ctxt, &l) @@ -3412,13 +3411,6 @@ xmlParseNameComplex(xmlParserCtxtPtr ctxt) { len += l; NEXTL(l); c = CUR_CHAR(l); - if (c == 0) { - count = 0; - GROW; - if (ctxt->instate == XML_PARSER_EOF) - return(NULL); - c = CUR_CHAR(l); - } } } if ((len > XML_MAX_NAME_LENGTH) && @@ -3426,6 +3418,16 @@ xmlParseNameComplex(xmlParserCtxtPtr ctxt) { xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name"); return(NULL); } + if (ctxt->input->cur - ctxt->input->base < len) { + /* + * There were a couple of bugs where PERefs lead to to a change + * of the buffer. Check the buffer size to avoid passing an invalid + * pointer to xmlDictLookup. + */ + xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, + "unexpected change of input buffer"); + return (NULL); + } if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) return(xmlDictLookup(ctxt->dict, ctxt->input->cur - (len + 1), len)); return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); diff --git a/result/errors10/781205.xml b/result/errors10/781205.xml new file mode 100644 index 00000000..e69de29b diff --git a/result/errors10/781205.xml.err b/result/errors10/781205.xml.err new file mode 100644 index 00000000..da15c3f7 --- /dev/null +++ b/result/errors10/781205.xml.err @@ -0,0 +1,21 @@ +Entity: line 1: parser error : internal error: xmlParseInternalSubset: error detected in Markup declaration + + %a; + ^ +Entity: line 1: +<:0000 +^ +Entity: line 1: parser error : DOCTYPE improperly terminated + %a; + ^ +Entity: line 1: +<:0000 +^ +namespace error : Failed to parse QName ':0000' + %a; + ^ +<:0000 + ^ +./test/errors10/781205.xml:4: parser error : Couldn't find end of Start Tag :0000 line 1 + +^ diff --git a/result/errors10/781361.xml b/result/errors10/781361.xml new file mode 100644 index 00000000..e69de29b diff --git a/result/errors10/781361.xml.err b/result/errors10/781361.xml.err new file mode 100644 index 00000000..655f41a2 --- /dev/null +++ b/result/errors10/781361.xml.err @@ -0,0 +1,13 @@ +./test/errors10/781361.xml:4: parser error : xmlParseElementDecl: 'EMPTY', 'ANY' or '(' expected + +^ +./test/errors10/781361.xml:4: parser error : internal error: xmlParseInternalSubset: error detected in Markup declaration + + +^ +./test/errors10/781361.xml:4: parser error : DOCTYPE improperly terminated + +^ +./test/errors10/781361.xml:4: parser error : Start tag expected, '<' not found + +^ diff --git a/result/valid/766956.xml b/result/valid/766956.xml new file mode 100644 index 00000000..e69de29b diff --git a/result/valid/766956.xml.err b/result/valid/766956.xml.err new file mode 100644 index 00000000..34b1dae6 --- /dev/null +++ b/result/valid/766956.xml.err @@ -0,0 +1,9 @@ +test/valid/dtds/766956.dtd:2: parser error : PEReference: expecting ';' +%ä%ent; + ^ +Entity: line 1: parser error : Content error in the external subset + %ent; + ^ +Entity: line 1: +value +^ diff --git a/result/valid/766956.xml.err.rdr b/result/valid/766956.xml.err.rdr new file mode 100644 index 00000000..77603462 --- /dev/null +++ b/result/valid/766956.xml.err.rdr @@ -0,0 +1,10 @@ +test/valid/dtds/766956.dtd:2: parser error : PEReference: expecting ';' +%ä%ent; + ^ +Entity: line 1: parser error : Content error in the external subset + %ent; + ^ +Entity: line 1: +value +^ +./test/valid/766956.xml : failed to parse diff --git a/runtest.c b/runtest.c index b2ce693b..378b38e3 100644 --- a/runtest.c +++ b/runtest.c @@ -4214,6 +4214,9 @@ testDesc testDescriptions[] = { { "Error cases regression tests", errParseTest, "./test/errors/*.xml", "result/errors/", "", ".err", 0 }, + { "Error cases regression tests (old 1.0)", + errParseTest, "./test/errors10/*.xml", "result/errors10/", "", ".err", + XML_PARSE_OLD10 }, #ifdef LIBXML_READER_ENABLED { "Error cases stream regression tests", streamParseTest, "./test/errors/*.xml", "result/errors/", NULL, ".str", diff --git a/test/errors10/781205.xml b/test/errors10/781205.xml new file mode 100644 index 00000000..d9e9e839 --- /dev/null +++ b/test/errors10/781205.xml @@ -0,0 +1,3 @@ + + %a; diff --git a/test/errors10/781361.xml b/test/errors10/781361.xml new file mode 100644 index 00000000..67476bcb --- /dev/null +++ b/test/errors10/781361.xml @@ -0,0 +1,3 @@ + + %elem; diff --git a/test/valid/766956.xml b/test/valid/766956.xml new file mode 100644 index 00000000..19a95a0e --- /dev/null +++ b/test/valid/766956.xml @@ -0,0 +1,2 @@ + + diff --git a/test/valid/dtds/766956.dtd b/test/valid/dtds/766956.dtd new file mode 100644 index 00000000..dddde68b --- /dev/null +++ b/test/valid/dtds/766956.dtd @@ -0,0 +1,2 @@ + +%ä%ent;