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;