1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2026-01-26 21:41:34 +03:00

parser: Improve handling of NOCDATA option

Don't modify the callback structure. This makes sure that unsetting the
option works.
This commit is contained in:
Nick Wellnhofer
2025-01-31 16:45:35 +01:00
parent 1f5b5371cf
commit 57e4bbd803

View File

@@ -7559,7 +7559,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) {
int len = xmlStrlen(cur->content); int len = xmlStrlen(cur->content);
if ((cur->type == XML_TEXT_NODE) || if ((cur->type == XML_TEXT_NODE) ||
(ctxt->sax->cdataBlock == NULL)) { (ctxt->options & XML_PARSE_NOCDATA)) {
if (ctxt->sax->characters != NULL) if (ctxt->sax->characters != NULL)
ctxt->sax->characters(ctxt, cur->content, len); ctxt->sax->characters(ctxt, cur->content, len);
} else { } else {
@@ -7582,7 +7582,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) {
int len = xmlStrlen(cur->content); int len = xmlStrlen(cur->content);
if ((cur->type == XML_TEXT_NODE) || if ((cur->type == XML_TEXT_NODE) ||
(ctxt->sax->cdataBlock == NULL)) { (ctxt->options & XML_PARSE_NOCDATA)) {
if (ctxt->sax->characters != NULL) if (ctxt->sax->characters != NULL)
ctxt->sax->characters(ctxt, cur->content, len); ctxt->sax->characters(ctxt, cur->content, len);
} else { } else {
@@ -9820,10 +9820,13 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
* OK the buffer is to be consumed as cdata. * OK the buffer is to be consumed as cdata.
*/ */
if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) {
if (ctxt->sax->cdataBlock != NULL) if (ctxt->options & XML_PARSE_NOCDATA) {
ctxt->sax->cdataBlock(ctxt->userData, buf, len); if (ctxt->sax->characters != NULL)
else if (ctxt->sax->characters != NULL) ctxt->sax->characters(ctxt->userData, buf, len);
ctxt->sax->characters(ctxt->userData, buf, len); } else {
if (ctxt->sax->cdataBlock != NULL)
ctxt->sax->cdataBlock(ctxt->userData, buf, len);
}
} }
out: out:
@@ -13575,12 +13578,6 @@ xmlCtxtSetOptionsInternal(xmlParserCtxtPtr ctxt, int options, int keepMask)
ctxt->keepBlanks = (options & XML_PARSE_NOBLANKS) ? 0 : 1; ctxt->keepBlanks = (options & XML_PARSE_NOBLANKS) ? 0 : 1;
ctxt->dictNames = (options & XML_PARSE_NODICT) ? 0 : 1; ctxt->dictNames = (options & XML_PARSE_NODICT) ? 0 : 1;
/*
* Changing SAX callbacks is a bad idea. This should be fixed.
*/
if (options & XML_PARSE_NOCDATA) {
ctxt->sax->cdataBlock = NULL;
}
if (options & XML_PARSE_HUGE) { if (options & XML_PARSE_HUGE) {
if (ctxt->dict != NULL) if (ctxt->dict != NULL)
xmlDictSetLimit(ctxt->dict, 0); xmlDictSetLimit(ctxt->dict, 0);