diff --git a/parser.c b/parser.c
index 3bd2ccc1..8af8aeab 100644
--- a/parser.c
+++ b/parser.c
@@ -7363,9 +7363,22 @@ xmlParseReference(xmlParserCtxtPtr ctxt) {
* We are seeing an entity reference
*/
name = xmlParseEntityRefInternal(ctxt);
- if (name != NULL)
- ent = xmlLookupGeneralEntity(ctxt, name, /* isAttr */ 0);
- if (ent == NULL) return;
+ if (name == NULL)
+ return;
+ ent = xmlLookupGeneralEntity(ctxt, name, /* isAttr */ 0);
+ if (ent == NULL) {
+ /*
+ * Create a reference for undeclared entities.
+ * TODO: Should we really create a reference if entity
+ * substitution is enabled?
+ */
+ if ((ctxt->sax != NULL) &&
+ (ctxt->disableSAX == 0) &&
+ (ctxt->sax->reference != NULL)) {
+ ctxt->sax->reference(ctxt->userData, name);
+ }
+ return;
+ }
if (!ctxt->wellFormed)
return;
@@ -7602,12 +7615,6 @@ xmlLookupGeneralEntity(xmlParserCtxtPtr ctxt, const xmlChar *name, int inAttr) {
} else {
xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY,
"Entity '%s' not defined\n", name, NULL);
- if ((ctxt->inSubset == 0) &&
- (ctxt->sax != NULL) &&
- (ctxt->disableSAX == 0) &&
- (ctxt->sax->reference != NULL)) {
- ctxt->sax->reference(ctxt->userData, name);
- }
}
ctxt->valid = 0;
}
diff --git a/result/noent/undeclared-entity.xml b/result/noent/undeclared-entity.xml
new file mode 100644
index 00000000..1fd092f7
--- /dev/null
+++ b/result/noent/undeclared-entity.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+ &undeclared;
+
diff --git a/result/noent/undeclared-entity.xml.sax2 b/result/noent/undeclared-entity.xml.sax2
new file mode 100644
index 00000000..56f3f3d9
--- /dev/null
+++ b/result/noent/undeclared-entity.xml.sax2
@@ -0,0 +1,24 @@
+SAX.setDocumentLocator()
+SAX.startDocument()
+SAX.comment( Having an external DTD makes undeclared entities a warning. )
+SAX.internalSubset(doc, , foo)
+SAX.externalSubset(doc, , foo)
+SAX.startElementNs(doc, NULL, NULL, 0, 0, 0)
+SAX.characters(
+ , 5)
+SAX.getEntity(undeclared)
+SAX.warning: Entity 'undeclared' not defined
+SAX.startElementNs(elem, NULL, NULL, 0, 1, 0, attr='"/>
+...', 0)
+SAX.endElementNs(elem, NULL, NULL)
+SAX.characters(
+ , 5)
+SAX.startElementNs(elem, NULL, NULL, 0, 0, 0)
+SAX.getEntity(undeclared)
+SAX.warning: Entity 'undeclared' not defined
+SAX.reference(undeclared)
+SAX.endElementNs(elem, NULL, NULL)
+SAX.characters(
+, 1)
+SAX.endElementNs(doc, NULL, NULL)
+SAX.endDocument()
diff --git a/result/undeclared-entity.xml b/result/undeclared-entity.xml
new file mode 100644
index 00000000..1fd092f7
--- /dev/null
+++ b/result/undeclared-entity.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+ &undeclared;
+
diff --git a/result/undeclared-entity.xml.rde b/result/undeclared-entity.xml.rde
new file mode 100644
index 00000000..29ebf622
--- /dev/null
+++ b/result/undeclared-entity.xml.rde
@@ -0,0 +1,14 @@
+0 8 #comment 0 1 Having an external DTD makes undeclared entities a warning.
+0 10 doc 0 0
+0 1 doc 0 0
+1 14 #text 0 1
+
+1 1 elem 1 0
+1 14 #text 0 1
+
+1 1 elem 0 0
+2 5 undeclared 0 0
+1 15 elem 0 0
+1 14 #text 0 1
+
+0 15 doc 0 0
diff --git a/result/undeclared-entity.xml.rdr b/result/undeclared-entity.xml.rdr
new file mode 100644
index 00000000..29ebf622
--- /dev/null
+++ b/result/undeclared-entity.xml.rdr
@@ -0,0 +1,14 @@
+0 8 #comment 0 1 Having an external DTD makes undeclared entities a warning.
+0 10 doc 0 0
+0 1 doc 0 0
+1 14 #text 0 1
+
+1 1 elem 1 0
+1 14 #text 0 1
+
+1 1 elem 0 0
+2 5 undeclared 0 0
+1 15 elem 0 0
+1 14 #text 0 1
+
+0 15 doc 0 0
diff --git a/result/undeclared-entity.xml.sax b/result/undeclared-entity.xml.sax
new file mode 100644
index 00000000..90e7e54e
--- /dev/null
+++ b/result/undeclared-entity.xml.sax
@@ -0,0 +1,23 @@
+SAX.setDocumentLocator()
+SAX.startDocument()
+SAX.comment( Having an external DTD makes undeclared entities a warning. )
+SAX.internalSubset(doc, , foo)
+SAX.externalSubset(doc, , foo)
+SAX.startElement(doc)
+SAX.characters(
+ , 5)
+SAX.getEntity(undeclared)
+SAX.warning: Entity 'undeclared' not defined
+SAX.startElement(elem, attr='')
+SAX.endElement(elem)
+SAX.characters(
+ , 5)
+SAX.startElement(elem)
+SAX.getEntity(undeclared)
+SAX.warning: Entity 'undeclared' not defined
+SAX.reference(undeclared)
+SAX.endElement(elem)
+SAX.characters(
+, 1)
+SAX.endElement(doc)
+SAX.endDocument()
diff --git a/result/undeclared-entity.xml.sax2 b/result/undeclared-entity.xml.sax2
new file mode 100644
index 00000000..56f3f3d9
--- /dev/null
+++ b/result/undeclared-entity.xml.sax2
@@ -0,0 +1,24 @@
+SAX.setDocumentLocator()
+SAX.startDocument()
+SAX.comment( Having an external DTD makes undeclared entities a warning. )
+SAX.internalSubset(doc, , foo)
+SAX.externalSubset(doc, , foo)
+SAX.startElementNs(doc, NULL, NULL, 0, 0, 0)
+SAX.characters(
+ , 5)
+SAX.getEntity(undeclared)
+SAX.warning: Entity 'undeclared' not defined
+SAX.startElementNs(elem, NULL, NULL, 0, 1, 0, attr='"/>
+...', 0)
+SAX.endElementNs(elem, NULL, NULL)
+SAX.characters(
+ , 5)
+SAX.startElementNs(elem, NULL, NULL, 0, 0, 0)
+SAX.getEntity(undeclared)
+SAX.warning: Entity 'undeclared' not defined
+SAX.reference(undeclared)
+SAX.endElementNs(elem, NULL, NULL)
+SAX.characters(
+, 1)
+SAX.endElementNs(doc, NULL, NULL)
+SAX.endDocument()
diff --git a/test/undeclared-entity.xml b/test/undeclared-entity.xml
new file mode 100644
index 00000000..b2a335c3
--- /dev/null
+++ b/test/undeclared-entity.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ &undeclared;
+