diff --git a/parser.c b/parser.c index 9740e9bf..b717e12e 100644 --- a/parser.c +++ b/parser.c @@ -8183,7 +8183,7 @@ xmlParsePEReference(xmlParserCtxtPtr ctxt) */ static int xmlLoadEntityContent(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) { - xmlParserInputPtr input = NULL; + xmlParserInputPtr oldinput, input = NULL; xmlChar *content = NULL; size_t length, i; int ret = -1; @@ -8210,6 +8210,32 @@ xmlLoadEntityContent(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) { return(-1); } + xmlBufResetInput(input->buf->buffer, input); + + oldinput = ctxt->input; + ctxt->input = input; + + xmlDetectEncoding(ctxt); + + /* + * Parse a possible text declaration first + */ + if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) { + xmlParseTextDecl(ctxt); + /* + * An XML-1.0 document can't reference an entity not XML-1.0 + */ + if ((xmlStrEqual(ctxt->version, BAD_CAST "1.0")) && + (!xmlStrEqual(ctxt->input->version, BAD_CAST "1.0"))) { + xmlFatalErrMsg(ctxt, XML_ERR_VERSION_MISMATCH, + "Version mismatch between document and entity\n"); + } + } + + ctxt->input = oldinput; + + xmlBufShrink(input->buf->buffer, input->cur - input->base); + while ((res = xmlParserInputBufferGrow(input->buf, 16384)) > 0) ; diff --git a/result/valid/pe-val-latin1.xml b/result/valid/pe-val-latin1.xml new file mode 100644 index 00000000..4da3720d --- /dev/null +++ b/result/valid/pe-val-latin1.xml @@ -0,0 +1,3 @@ + + +&latin1; diff --git a/test/valid/dtds/pe-val-latin1.dtd b/test/valid/dtds/pe-val-latin1.dtd new file mode 100644 index 00000000..c7bcb722 --- /dev/null +++ b/test/valid/dtds/pe-val-latin1.dtd @@ -0,0 +1,3 @@ + + + diff --git a/test/valid/dtds/pe-val-latin1.ent b/test/valid/dtds/pe-val-latin1.ent new file mode 100644 index 00000000..171e58f2 --- /dev/null +++ b/test/valid/dtds/pe-val-latin1.ent @@ -0,0 +1,2 @@ + +äöü diff --git a/test/valid/pe-val-latin1.xml b/test/valid/pe-val-latin1.xml new file mode 100644 index 00000000..97664a8c --- /dev/null +++ b/test/valid/pe-val-latin1.xml @@ -0,0 +1,2 @@ + +&latin1;