1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-03-25 10:50:08 +03:00

parser: Copy namespaces in xmlParseBalancedChunkMemory

Reenable copying of namespaces but don't set SAX data. This should
match the old behavior.
This commit is contained in:
Nick Wellnhofer 2023-10-31 13:53:15 +01:00
parent 89d19534de
commit e0c2f14d83
9 changed files with 137 additions and 9 deletions

View File

@ -12994,9 +12994,7 @@ xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt,
xmlNodePtr content = NULL;
xmlNodePtr last = NULL;
xmlParserErrors ret = XML_ERR_OK;
#if 0
unsigned i;
#endif
if (((oldctxt->depth > 40) && ((oldctxt->options & XML_PARSE_HUGE) == 0)) ||
(oldctxt->depth > 100)) {
@ -13029,14 +13027,9 @@ xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt,
/*
* Propagate namespaces down the entity
*
* This is disabled for now. The pre-2.12 code was already broken
* since the SAX handler was using xmlSearchNs which didn't see the
* namespaces added here.
*
* Making entities and namespaces work correctly requires additional
* changes, see xmlParseReference.
*/
#if 0
for (i = 0; i < oldctxt->nsdb->hashSize; i++) {
xmlParserNsBucket *bucket = &oldctxt->nsdb->hash[i];
xmlHashedString hprefix, huri;
@ -13054,10 +13047,13 @@ xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt,
hprefix.hashValue = bucket->hashValue;
huri.name = ns[1];
huri.hashValue = extra->uriHashValue;
xmlParserNsPush(ctxt, &hprefix, &huri, extra->saxData, 0);
/*
* Don't copy SAX data top avoid a use-after-free in reader
* mode. This matches the pre-2.12 behavior.
*/
xmlParserNsPush(ctxt, &hprefix, &huri, NULL, 0);
}
}
#endif
oldsax = ctxt->sax;
ctxt->sax = oldctxt->sax;

8
result/noent/ns-ent.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0"?>
<!DOCTYPE doc [
<!ENTITY ent "<ns:elem/>">
]>
<doc>
<c1 xmlns:ns="urn:ns1"><elem/></c1>
<c2 xmlns:ns="urn:ns2"><elem/></c2>
</doc>

View File

@ -0,0 +1,25 @@
SAX.setDocumentLocator()
SAX.startDocument()
SAX.internalSubset(doc, , )
SAX.entityDecl(ent, 1, (null), (null), <ns:elem/>)
SAX.getEntity(ent)
SAX.externalSubset(doc, , )
SAX.startElementNs(doc, NULL, NULL, 0, 0, 0)
SAX.characters(
, 5)
SAX.startElementNs(c1, NULL, NULL, 1, xmlns:ns='urn:ns1', 0, 0)
SAX.getEntity(ent)
SAX.startElementNs(elem, ns, 'urn:ns1', 0, 0, 0)
SAX.endElementNs(elem, ns, 'urn:ns1')
SAX.endElementNs(c1, NULL, NULL)
SAX.characters(
, 5)
SAX.startElementNs(c2, NULL, NULL, 1, xmlns:ns='urn:ns2', 0, 0)
SAX.getEntity(ent)
SAX.startElementNs(elem, ns, 'urn:ns2', 0, 0, 0)
SAX.endElementNs(elem, ns, 'urn:ns2')
SAX.endElementNs(c2, NULL, NULL)
SAX.characters(
, 1)
SAX.endElementNs(doc, NULL, NULL)
SAX.endDocument()

8
result/ns-ent.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0"?>
<!DOCTYPE doc [
<!ENTITY ent "<ns:elem/>">
]>
<doc>
<c1 xmlns:ns="urn:ns1">&ent;</c1>
<c2 xmlns:ns="urn:ns2">&ent;</c2>
</doc>

15
result/ns-ent.xml.rde Normal file
View File

@ -0,0 +1,15 @@
0 10 doc 0 0
0 1 doc 0 0
1 14 #text 0 1
1 1 c1 0 0
2 1 elem 1 0
1 15 c1 0 0
1 14 #text 0 1
1 1 c2 0 0
2 1 elem 1 0
1 15 c2 0 0
1 14 #text 0 1
0 15 doc 0 0

15
result/ns-ent.xml.rdr Normal file
View File

@ -0,0 +1,15 @@
0 10 doc 0 0
0 1 doc 0 0
1 14 #text 0 1
1 1 c1 0 0
2 5 ent 0 0
1 15 c1 0 0
1 14 #text 0 1
1 1 c2 0 0
2 5 ent 0 0
1 15 c2 0 0
1 14 #text 0 1
0 15 doc 0 0

27
result/ns-ent.xml.sax Normal file
View File

@ -0,0 +1,27 @@
SAX.setDocumentLocator()
SAX.startDocument()
SAX.internalSubset(doc, , )
SAX.entityDecl(ent, 1, (null), (null), <ns:elem/>)
SAX.getEntity(ent)
SAX.externalSubset(doc, , )
SAX.startElement(doc)
SAX.characters(
, 5)
SAX.startElement(c1, xmlns:ns='urn:ns1')
SAX.getEntity(ent)
SAX.startElement(ns:elem)
SAX.endElement(ns:elem)
SAX.reference(ent)
SAX.endElement(c1)
SAX.characters(
, 5)
SAX.startElement(c2, xmlns:ns='urn:ns2')
SAX.getEntity(ent)
SAX.startElement(ns:elem)
SAX.endElement(ns:elem)
SAX.reference(ent)
SAX.endElement(c2)
SAX.characters(
, 1)
SAX.endElement(doc)
SAX.endDocument()

27
result/ns-ent.xml.sax2 Normal file
View File

@ -0,0 +1,27 @@
SAX.setDocumentLocator()
SAX.startDocument()
SAX.internalSubset(doc, , )
SAX.entityDecl(ent, 1, (null), (null), <ns:elem/>)
SAX.getEntity(ent)
SAX.externalSubset(doc, , )
SAX.startElementNs(doc, NULL, NULL, 0, 0, 0)
SAX.characters(
, 5)
SAX.startElementNs(c1, NULL, NULL, 1, xmlns:ns='urn:ns1', 0, 0)
SAX.getEntity(ent)
SAX.startElementNs(elem, ns, 'urn:ns1', 0, 0, 0)
SAX.endElementNs(elem, ns, 'urn:ns1')
SAX.reference(ent)
SAX.endElementNs(c1, NULL, NULL)
SAX.characters(
, 5)
SAX.startElementNs(c2, NULL, NULL, 1, xmlns:ns='urn:ns2', 0, 0)
SAX.getEntity(ent)
SAX.startElementNs(elem, ns, 'urn:ns2', 0, 0, 0)
SAX.endElementNs(elem, ns, 'urn:ns2')
SAX.reference(ent)
SAX.endElementNs(c2, NULL, NULL)
SAX.characters(
, 1)
SAX.endElementNs(doc, NULL, NULL)
SAX.endDocument()

7
test/ns-ent.xml Normal file
View File

@ -0,0 +1,7 @@
<!DOCTYPE doc [
<!ENTITY ent "<ns:elem/>">
]>
<doc>
<c1 xmlns:ns="urn:ns1">&ent;</c1>
<c2 xmlns:ns="urn:ns2">&ent;</c2>
</doc>