From 87786d6200ae1f5ac98d21f04d451e17ff25a216 Mon Sep 17 00:00:00 2001 From: David Kilzer Date: Mon, 23 Jun 2025 14:41:56 -0700 Subject: [PATCH] libxslt: heap-use-after-free in xmlFreeID caused by `atype` corruption * include/libxml/tree.h: (XML_ATTR_CLEAR_ATYPE): Add. (XML_ATTR_GET_ATYPE): Add. (XML_ATTR_SET_ATYPE): Add. (XML_NODE_ADD_EXTRA): Add. (XML_NODE_CLEAR_EXTRA): Add. (XML_NODE_GET_EXTRA): Add. (XML_NODE_SET_EXTRA): Add. (XML_DOC_ADD_PROPERTIES): Add. (XML_DOC_CLEAR_PROPERTIES): Add. (XML_DOC_GET_PROPERTIES): Add. (XML_DOC_SET_PROPERTIES): Add. - Add macros for accessing fields with upper bits that may be set by libxslt. * HTMLparser.c: (htmlNewDocNoDtD): * SAX2.c: (xmlSAX2StartDocument): (xmlSAX2EndDocument): * parser.c: (xmlParseEntityDecl): (xmlParseExternalSubset): (xmlParseReference): (xmlCtxtParseDtd): * runxmlconf.c: (xmlconfTestInvalid): (xmlconfTestValid): * tree.c: (xmlNewDoc): (xmlFreeProp): (xmlNodeSetDoc): (xmlSetNsProp): (xmlDOMWrapAdoptBranch): * valid.c: (xmlFreeID): (xmlAddIDInternal): (xmlValidateAttributeValueInternal): (xmlValidateOneAttribute): (xmlValidateRef): * xmlreader.c: (xmlTextReaderStartElement): (xmlTextReaderStartElementNs): (xmlTextReaderValidateEntity): (xmlTextReaderRead): (xmlTextReaderNext): (xmlTextReaderIsEmptyElement): (xmlTextReaderPreserve): * xmlschemas.c: (xmlSchemaPValAttrNodeID): * xmlschemastypes.c: (xmlSchemaValAtomicType): - Adopt macros by renaming the struct fields, recompiling and fixing compiler failures, then changing the struct field names back. --- HTMLparser.c | 1 + SAX2.c | 6 ++-- include/libxml/tree.h | 14 ++++++++- parser.c | 8 ++--- runxmlconf.c | 4 +-- tree.c | 20 ++++++------- valid.c | 68 +++++++++++++++++++++---------------------- xmlreader.c | 30 +++++++++---------- xmlschemas.c | 4 +-- xmlschemastypes.c | 12 ++++---- 10 files changed, 90 insertions(+), 77 deletions(-) diff --git a/HTMLparser.c b/HTMLparser.c index e4f816e5..0ed96ad0 100644 --- a/HTMLparser.c +++ b/HTMLparser.c @@ -2335,6 +2335,7 @@ htmlNewDocNoDtD(const xmlChar *URI, const xmlChar *ExternalID) { cur->refs = NULL; cur->_private = NULL; cur->charset = XML_CHAR_ENCODING_UTF8; + XML_DOC_SET_PROPERTIES(cur, XML_DOC_HTML | XML_DOC_USERBUILT); cur->properties = XML_DOC_HTML | XML_DOC_USERBUILT; if ((ExternalID != NULL) || (URI != NULL)) diff --git a/SAX2.c b/SAX2.c index 0f261b7b..f283e5d1 100644 --- a/SAX2.c +++ b/SAX2.c @@ -999,7 +999,7 @@ xmlSAX2StartDocument(void *ctx) xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument"); return; } - ctxt->myDoc->properties = XML_DOC_HTML; + XML_DOC_SET_PROPERTIES(ctxt->myDoc, XML_DOC_HTML); ctxt->myDoc->parseFlags = ctxt->options; #else xmlGenericError(xmlGenericErrorContext, @@ -1012,9 +1012,9 @@ xmlSAX2StartDocument(void *ctx) } else { doc = ctxt->myDoc = xmlNewDoc(ctxt->version); if (doc != NULL) { - doc->properties = 0; + XML_DOC_CLEAR_PROPERTIES(doc); if (ctxt->options & XML_PARSE_OLD10) - doc->properties |= XML_DOC_OLD10; + XML_DOC_ADD_PROPERTIES(doc, XML_DOC_OLD10); doc->parseFlags = ctxt->options; if (ctxt->encoding != NULL) doc->encoding = xmlStrdup(ctxt->encoding); diff --git a/include/libxml/tree.h b/include/libxml/tree.h index 4a9b3bc6..91ea0602 100644 --- a/include/libxml/tree.h +++ b/include/libxml/tree.h @@ -365,7 +365,6 @@ struct _xmlElement { #endif }; - /** * XML_LOCAL_NAMESPACE: * @@ -446,6 +445,10 @@ struct _xmlAttr { void *psvi; /* for type/PSVI informations */ }; +#define XML_ATTR_CLEAR_ATYPE(attr) (((attr)->atype) = 0) +#define XML_ATTR_GET_ATYPE(attr) (((attr)->atype) & ~(15U << 27)) +#define XML_ATTR_SET_ATYPE(attr, type) ((attr)->atype = ((((attr)->atype) & (15U << 27)) | ((type) & ~(15U << 27)))) + /** * xmlID: * @@ -507,6 +510,11 @@ struct _xmlNode { unsigned short extra; /* extra data for XPath/XSLT */ }; +#define XML_NODE_ADD_EXTRA(node, type) ((node)->extra |= ((type) & ~(15U << 12))) +#define XML_NODE_CLEAR_EXTRA(node) (((node)->extra) = 0) +#define XML_NODE_GET_EXTRA(node) (((node)->extra) & ~(15U << 12)) +#define XML_NODE_SET_EXTRA(node, type) ((node)->extra = ((((node)->extra) & (15U << 12)) | ((type) & ~(15U << 12)))) + /** * XML_GET_CONTENT: * @@ -585,6 +593,10 @@ struct _xmlDoc { set at the end of parsing */ }; +#define XML_DOC_ADD_PROPERTIES(doc, type) ((doc)->properties |= ((type) & ~(15U << 27))) +#define XML_DOC_CLEAR_PROPERTIES(doc) (((doc)->properties) = 0) +#define XML_DOC_GET_PROPERTIES(doc) (((doc)->properties) & ~(15U << 27)) +#define XML_DOC_SET_PROPERTIES(doc, type) ((doc)->properties = ((((doc)->properties) & (15U << 27)) | ((type) & ~(15U << 27)))) typedef struct _xmlDOMWrapCtxt xmlDOMWrapCtxt; typedef xmlDOMWrapCtxt *xmlDOMWrapCtxtPtr; diff --git a/parser.c b/parser.c index 1c5e036e..874cef74 100644 --- a/parser.c +++ b/parser.c @@ -5446,7 +5446,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) { xmlErrMemory(ctxt, "New Doc failed"); return; } - ctxt->myDoc->properties = XML_DOC_INTERNAL; + XML_DOC_SET_PROPERTIES(ctxt->myDoc, XML_DOC_INTERNAL); } if (ctxt->myDoc->intSubset == NULL) ctxt->myDoc->intSubset = xmlNewDtd(ctxt->myDoc, @@ -5517,7 +5517,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) { xmlErrMemory(ctxt, "New Doc failed"); return; } - ctxt->myDoc->properties = XML_DOC_INTERNAL; + XML_DOC_SET_PROPERTIES(ctxt->myDoc, XML_DOC_INTERNAL); } if (ctxt->myDoc->intSubset == NULL) @@ -6953,7 +6953,7 @@ xmlParseExternalSubset(xmlParserCtxtPtr ctxt, const xmlChar *ExternalID, xmlErrMemory(ctxt, "New Doc failed"); return; } - ctxt->myDoc->properties = XML_DOC_INTERNAL; + XML_DOC_SET_PROPERTIES(ctxt->myDoc, XML_DOC_INTERNAL); } if ((ctxt->myDoc != NULL) && (ctxt->myDoc->intSubset == NULL)) xmlCreateIntSubset(ctxt->myDoc, NULL, ExternalID, SystemID); @@ -7335,7 +7335,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) { (nw != NULL) && (nw->type == XML_ELEMENT_NODE) && (nw->children == NULL)) - nw->extra = 1; + XML_NODE_SET_EXTRA(nw, 1); break; } diff --git a/runxmlconf.c b/runxmlconf.c index cef20f48..e233eaf8 100644 --- a/runxmlconf.c +++ b/runxmlconf.c @@ -197,7 +197,7 @@ xmlconfTestInvalid(const char *id, const char *filename, int options) { id, filename); } else { /* invalidity should be reported both in the context and in the document */ - if ((ctxt->valid != 0) || (doc->properties & XML_DOC_DTDVALID)) { + if ((ctxt->valid != 0) || (XML_DOC_GET_PROPERTIES(doc) & XML_DOC_DTDVALID)) { test_log("test %s : %s failed to detect invalid document\n", id, filename); nb_errors++; @@ -229,7 +229,7 @@ xmlconfTestValid(const char *id, const char *filename, int options) { ret = 0; } else { /* validity should be reported both in the context and in the document */ - if ((ctxt->valid == 0) || ((doc->properties & XML_DOC_DTDVALID) == 0)) { + if ((ctxt->valid == 0) || ((XML_DOC_GET_PROPERTIES(doc) & XML_DOC_DTDVALID) == 0)) { test_log("test %s : %s failed to validate a valid document\n", id, filename); nb_errors++; diff --git a/tree.c b/tree.c index 86a8da79..f701baa6 100644 --- a/tree.c +++ b/tree.c @@ -1186,7 +1186,7 @@ xmlNewDoc(const xmlChar *version) { cur->compression = -1; /* not initialized */ cur->doc = cur; cur->parseFlags = 0; - cur->properties = XML_DOC_USERBUILT; + XML_DOC_SET_PROPERTIES(cur, XML_DOC_USERBUILT); /* * The in memory encoding is always UTF8 * This field will never change and would @@ -2091,7 +2091,7 @@ xmlFreeProp(xmlAttrPtr cur) { xmlDeregisterNodeDefaultValue((xmlNodePtr)cur); /* Check for ID removal -> leading to invalid references ! */ - if ((cur->doc != NULL) && (cur->atype == XML_ATTRIBUTE_ID)) { + if ((cur->doc != NULL) && (XML_ATTR_GET_ATYPE(cur) == XML_ATTRIBUTE_ID)) { xmlRemoveID(cur->doc, cur); } if (cur->children != NULL) xmlFreeNodeList(cur->children); @@ -2810,7 +2810,7 @@ xmlSetTreeDoc(xmlNodePtr tree, xmlDocPtr doc) { if(tree->type == XML_ELEMENT_NODE) { prop = tree->properties; while (prop != NULL) { - if (prop->atype == XML_ATTRIBUTE_ID) { + if (XML_ATTR_GET_ATYPE(prop) == XML_ATTRIBUTE_ID) { xmlRemoveID(tree->doc, prop); } @@ -6882,9 +6882,9 @@ xmlSetNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name, /* * Modify the attribute's value. */ - if (prop->atype == XML_ATTRIBUTE_ID) { + if (XML_ATTR_GET_ATYPE(prop) == XML_ATTRIBUTE_ID) { xmlRemoveID(node->doc, prop); - prop->atype = XML_ATTRIBUTE_ID; + XML_ATTR_SET_ATYPE(prop, XML_ATTRIBUTE_ID); } if (prop->children != NULL) xmlFreeNodeList(prop->children); @@ -6910,7 +6910,7 @@ xmlSetNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name, tmp = tmp->next; } } - if (prop->atype == XML_ATTRIBUTE_ID) + if (XML_ATTR_GET_ATYPE(prop) == XML_ATTRIBUTE_ID) xmlAddID(NULL, node->doc, value, prop); return(prop); } @@ -9200,7 +9200,7 @@ ns_end: if (cur->type == XML_ELEMENT_NODE) { cur->psvi = NULL; cur->line = 0; - cur->extra = 0; + XML_NODE_CLEAR_EXTRA(cur); /* * Walk attributes. */ @@ -9216,11 +9216,11 @@ ns_end: * Attributes. */ if ((sourceDoc != NULL) && - (((xmlAttrPtr) cur)->atype == XML_ATTRIBUTE_ID)) + (XML_ATTR_GET_ATYPE((xmlAttrPtr) cur) == XML_ATTRIBUTE_ID)) { xmlRemoveID(sourceDoc, (xmlAttrPtr) cur); } - ((xmlAttrPtr) cur)->atype = 0; + XML_ATTR_CLEAR_ATYPE((xmlAttrPtr) cur); ((xmlAttrPtr) cur)->psvi = NULL; } break; @@ -9940,7 +9940,7 @@ xmlDOMWrapAdoptAttr(xmlDOMWrapCtxtPtr ctxt, } XML_TREE_ADOPT_STR(attr->name); - attr->atype = 0; + XML_ATTR_CLEAR_ATYPE(attr); attr->psvi = NULL; /* * Walk content. diff --git a/valid.c b/valid.c index a64b96be..ff293750 100644 --- a/valid.c +++ b/valid.c @@ -1856,7 +1856,7 @@ xmlScanIDAttributeDecl(xmlValidCtxtPtr ctxt, xmlElementPtr elem, int err) { if (elem == NULL) return(0); cur = elem->attributes; while (cur != NULL) { - if (cur->atype == XML_ATTRIBUTE_ID) { + if (XML_ATTR_GET_ATYPE(cur) == XML_ATTRIBUTE_ID) { ret ++; if ((ret > 1) && (err)) xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_MULTIPLE_ID, @@ -2224,7 +2224,7 @@ xmlDumpAttributeDecl(xmlBufferPtr buf, xmlAttributePtr attr) { xmlBufferWriteChar(buf, ":"); } xmlBufferWriteCHAR(buf, attr->name); - switch (attr->atype) { + switch (XML_ATTR_GET_ATYPE(attr)) { case XML_ATTRIBUTE_CDATA: xmlBufferWriteChar(buf, " CDATA"); break; @@ -2649,7 +2649,7 @@ xmlAddID(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, return(NULL); } if (attr != NULL) - attr->atype = XML_ATTRIBUTE_ID; + XML_ATTR_SET_ATYPE(attr, XML_ATTRIBUTE_ID); return(ret); } @@ -2723,7 +2723,7 @@ xmlIsID(xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr) { if ((fullelemname != felem) && (fullelemname != elem->name)) xmlFree(fullelemname); - if ((attrDecl != NULL) && (attrDecl->atype == XML_ATTRIBUTE_ID)) + if ((attrDecl != NULL) && (XML_ATTR_GET_ATYPE(attrDecl) == XML_ATTRIBUTE_ID)) return(1); } return(0); @@ -2763,7 +2763,7 @@ xmlRemoveID(xmlDocPtr doc, xmlAttrPtr attr) { xmlHashRemoveEntry(table, ID, (xmlHashDeallocator) xmlFreeID); xmlFree(ID); - attr->atype = 0; + XML_ATTR_CLEAR_ATYPE(attr); return(0); } @@ -3041,8 +3041,8 @@ xmlIsRef(xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr) { elem->name, attr->name); if ((attrDecl != NULL) && - (attrDecl->atype == XML_ATTRIBUTE_IDREF || - attrDecl->atype == XML_ATTRIBUTE_IDREFS)) + (XML_ATTR_GET_ATYPE(attrDecl) == XML_ATTRIBUTE_IDREF || + XML_ATTR_GET_ATYPE(attrDecl) == XML_ATTRIBUTE_IDREFS)) return(1); } return(0); @@ -3417,7 +3417,7 @@ xmlIsMixedElement(xmlDocPtr doc, const xmlChar *name) { static int xmlIsDocNameStartChar(xmlDocPtr doc, int c) { - if ((doc == NULL) || (doc->properties & XML_DOC_OLD10) == 0) { + if ((doc == NULL) || (XML_DOC_GET_PROPERTIES(doc) & XML_DOC_OLD10) == 0) { /* * Use the new checks of production [4] [4a] amd [5] of the * Update 5 of XML-1.0 @@ -3447,7 +3447,7 @@ xmlIsDocNameStartChar(xmlDocPtr doc, int c) { static int xmlIsDocNameChar(xmlDocPtr doc, int c) { - if ((doc == NULL) || (doc->properties & XML_DOC_OLD10) == 0) { + if ((doc == NULL) || (XML_DOC_GET_PROPERTIES(doc) & XML_DOC_OLD10) == 0) { /* * Use the new checks of production [4] [4a] amd [5] of the * Update 5 of XML-1.0 @@ -3998,7 +3998,7 @@ xmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt, xmlDocPtr doc, if (attrDecl == NULL) return(NULL); - if (attrDecl->atype == XML_ATTRIBUTE_CDATA) + if (XML_ATTR_GET_ATYPE(attrDecl) == XML_ATTRIBUTE_CDATA) return(NULL); ret = xmlStrdup(value); @@ -4073,7 +4073,7 @@ xmlValidNormalizeAttributeValue(xmlDocPtr doc, xmlNodePtr elem, if (attrDecl == NULL) return(NULL); - if (attrDecl->atype == XML_ATTRIBUTE_CDATA) + if (XML_ATTR_GET_ATYPE(attrDecl) == XML_ATTRIBUTE_CDATA) return(NULL); ret = xmlStrdup(value); @@ -4098,7 +4098,7 @@ xmlValidNormalizeAttributeValue(xmlDocPtr doc, xmlNodePtr elem, static void xmlValidateAttributeIdCallback(xmlAttributePtr attr, int *count, const xmlChar* name ATTRIBUTE_UNUSED) { - if (attr->atype == XML_ATTRIBUTE_ID) (*count)++; + if (XML_ATTR_GET_ATYPE(attr) == XML_ATTRIBUTE_ID) (*count)++; } /** @@ -4130,7 +4130,7 @@ xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, /* Attribute Default Legal */ /* Enumeration */ if (attr->defaultValue != NULL) { - val = xmlValidateAttributeValueInternal(doc, attr->atype, + val = xmlValidateAttributeValueInternal(doc, XML_ATTR_GET_ATYPE(attr), attr->defaultValue); if (val == 0) { xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ATTRIBUTE_DEFAULT, @@ -4141,7 +4141,7 @@ xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, } /* ID Attribute Default */ - if ((attr->atype == XML_ATTRIBUTE_ID)&& + if ((XML_ATTR_GET_ATYPE(attr) == XML_ATTRIBUTE_ID)&& (attr->def != XML_ATTRIBUTE_IMPLIED) && (attr->def != XML_ATTRIBUTE_REQUIRED)) { xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ID_FIXED, @@ -4151,7 +4151,7 @@ xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, } /* One ID per Element Type */ - if (attr->atype == XML_ATTRIBUTE_ID) { + if (XML_ATTR_GET_ATYPE(attr) == XML_ATTRIBUTE_ID) { int nbId; /* the trick is that we parse DtD as their own internal subset */ @@ -4410,9 +4410,9 @@ xmlValidateOneAttribute(xmlValidCtxtPtr ctxt, xmlDocPtr doc, attr->name, elem->name, NULL); return(0); } - attr->atype = attrDecl->atype; + XML_ATTR_SET_ATYPE(attr, attrDecl->atype); - val = xmlValidateAttributeValueInternal(doc, attrDecl->atype, value); + val = xmlValidateAttributeValueInternal(doc, XML_ATTR_GET_ATYPE(attrDecl), value); if (val == 0) { xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, "Syntax of value for attribute %s of %s is not valid\n", @@ -4431,19 +4431,19 @@ xmlValidateOneAttribute(xmlValidCtxtPtr ctxt, xmlDocPtr doc, } /* Validity Constraint: ID uniqueness */ - if (attrDecl->atype == XML_ATTRIBUTE_ID) { + if (XML_ATTR_GET_ATYPE(attrDecl) == XML_ATTRIBUTE_ID) { if (xmlAddID(ctxt, doc, value, attr) == NULL) ret = 0; } - if ((attrDecl->atype == XML_ATTRIBUTE_IDREF) || - (attrDecl->atype == XML_ATTRIBUTE_IDREFS)) { + if ((XML_ATTR_GET_ATYPE(attrDecl) == XML_ATTRIBUTE_IDREF) || + (XML_ATTR_GET_ATYPE(attrDecl) == XML_ATTRIBUTE_IDREFS)) { if (xmlAddRef(ctxt, doc, value, attr) == NULL) ret = 0; } /* Validity Constraint: Notation Attributes */ - if (attrDecl->atype == XML_ATTRIBUTE_NOTATION) { + if (XML_ATTR_GET_ATYPE(attrDecl) == XML_ATTRIBUTE_NOTATION) { xmlEnumerationPtr tree = attrDecl->tree; xmlNotationPtr nota; @@ -4473,7 +4473,7 @@ xmlValidateOneAttribute(xmlValidCtxtPtr ctxt, xmlDocPtr doc, } /* Validity Constraint: Enumeration */ - if (attrDecl->atype == XML_ATTRIBUTE_ENUMERATION) { + if (XML_ATTR_GET_ATYPE(attrDecl) == XML_ATTRIBUTE_ENUMERATION) { xmlEnumerationPtr tree = attrDecl->tree; while (tree != NULL) { if (xmlStrEqual(tree->name, value)) break; @@ -4498,7 +4498,7 @@ xmlValidateOneAttribute(xmlValidCtxtPtr ctxt, xmlDocPtr doc, /* Extra check for the attribute value */ ret &= xmlValidateAttributeValue2(ctxt, doc, attr->name, - attrDecl->atype, value); + XML_ATTR_GET_ATYPE(attrDecl), value); return(ret); } @@ -4597,7 +4597,7 @@ xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value) { return(0); } - val = xmlValidateAttributeValueInternal(doc, attrDecl->atype, value); + val = xmlValidateAttributeValueInternal(doc, XML_ATTR_GET_ATYPE(attrDecl), value); if (val == 0) { if (ns->prefix != NULL) { xmlErrValidNode(ctxt, elem, XML_DTD_INVALID_DEFAULT, @@ -4647,7 +4647,7 @@ xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value) { #endif /* Validity Constraint: Notation Attributes */ - if (attrDecl->atype == XML_ATTRIBUTE_NOTATION) { + if (XML_ATTR_GET_ATYPE(attrDecl) == XML_ATTRIBUTE_NOTATION) { xmlEnumerationPtr tree = attrDecl->tree; xmlNotationPtr nota; @@ -4689,7 +4689,7 @@ xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value) { } /* Validity Constraint: Enumeration */ - if (attrDecl->atype == XML_ATTRIBUTE_ENUMERATION) { + if (XML_ATTR_GET_ATYPE(attrDecl) == XML_ATTRIBUTE_ENUMERATION) { xmlEnumerationPtr tree = attrDecl->tree; while (tree != NULL) { if (xmlStrEqual(tree->name, value)) break; @@ -4727,10 +4727,10 @@ xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value) { /* Extra check for the attribute value */ if (ns->prefix != NULL) { ret &= xmlValidateAttributeValue2(ctxt, doc, ns->prefix, - attrDecl->atype, value); + XML_ATTR_GET_ATYPE(attrDecl), value); } else { ret &= xmlValidateAttributeValue2(ctxt, doc, BAD_CAST "xmlns", - attrDecl->atype, value); + XML_ATTR_GET_ATYPE(attrDecl), value); } return(ret); @@ -6483,7 +6483,7 @@ xmlValidateRef(xmlRefPtr ref, xmlValidCtxtPtr ctxt, while (IS_BLANK_CH(*cur)) cur++; } xmlFree(dup); - } else if (attr->atype == XML_ATTRIBUTE_IDREF) { + } else if (XML_ATTR_GET_ATYPE(attr) == XML_ATTRIBUTE_IDREF) { id = xmlGetID(ctxt->doc, name); if (id == NULL) { xmlErrValidNode(ctxt, attr->parent, XML_DTD_UNKNOWN_ID, @@ -6491,7 +6491,7 @@ xmlValidateRef(xmlRefPtr ref, xmlValidCtxtPtr ctxt, attr->name, name, NULL); ctxt->valid = 0; } - } else if (attr->atype == XML_ATTRIBUTE_IDREFS) { + } else if (XML_ATTR_GET_ATYPE(attr) == XML_ATTRIBUTE_IDREFS) { xmlChar *dup, *str = NULL, *cur, save; dup = xmlStrdup(name); @@ -6686,7 +6686,7 @@ xmlValidateAttributeCallback(xmlAttributePtr cur, xmlValidCtxtPtr ctxt, if (cur == NULL) return; - switch (cur->atype) { + switch (XML_ATTR_GET_ATYPE(cur)) { case XML_ATTRIBUTE_CDATA: case XML_ATTRIBUTE_ID: case XML_ATTRIBUTE_IDREF : @@ -6701,7 +6701,7 @@ xmlValidateAttributeCallback(xmlAttributePtr cur, xmlValidCtxtPtr ctxt, if (cur->defaultValue != NULL) { ret = xmlValidateAttributeValue2(ctxt, ctxt->doc, cur->name, - cur->atype, cur->defaultValue); + XML_ATTR_GET_ATYPE(cur), cur->defaultValue); if ((ret == 0) && (ctxt->valid == 1)) ctxt->valid = 0; } @@ -6709,14 +6709,14 @@ xmlValidateAttributeCallback(xmlAttributePtr cur, xmlValidCtxtPtr ctxt, xmlEnumerationPtr tree = cur->tree; while (tree != NULL) { ret = xmlValidateAttributeValue2(ctxt, ctxt->doc, - cur->name, cur->atype, tree->name); + cur->name, XML_ATTR_GET_ATYPE(cur), tree->name); if ((ret == 0) && (ctxt->valid == 1)) ctxt->valid = 0; tree = tree->next; } } } - if (cur->atype == XML_ATTRIBUTE_NOTATION) { + if (XML_ATTR_GET_ATYPE(cur) == XML_ATTRIBUTE_NOTATION) { doc = cur->doc; if (cur->elem == NULL) { xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, diff --git a/xmlreader.c b/xmlreader.c index 34c4c6bc..1c584311 100644 --- a/xmlreader.c +++ b/xmlreader.c @@ -669,7 +669,7 @@ xmlTextReaderStartElement(void *ctx, const xmlChar *fullname, if ((ctxt->node != NULL) && (ctxt->input != NULL) && (ctxt->input->cur != NULL) && (ctxt->input->cur[0] == '/') && (ctxt->input->cur[1] == '>')) - ctxt->node->extra = NODE_IS_EMPTY; + XML_NODE_SET_EXTRA(ctxt->node, NODE_IS_EMPTY); } if (reader != NULL) reader->state = XML_TEXTREADER_ELEMENT; @@ -734,7 +734,7 @@ xmlTextReaderStartElementNs(void *ctx, if ((ctxt->node != NULL) && (ctxt->input != NULL) && (ctxt->input->cur != NULL) && (ctxt->input->cur[0] == '/') && (ctxt->input->cur[1] == '>')) - ctxt->node->extra = NODE_IS_EMPTY; + XML_NODE_SET_EXTRA(ctxt->node, NODE_IS_EMPTY); } if (reader != NULL) reader->state = XML_TEXTREADER_ELEMENT; @@ -1143,7 +1143,7 @@ xmlTextReaderValidateEntity(xmlTextReaderPtr reader) { xmlNodePtr tmp; if (reader->entNr == 0) { while ((tmp = node->last) != NULL) { - if ((tmp->extra & NODE_IS_PRESERVED) == 0) { + if ((XML_NODE_GET_EXTRA(tmp) & NODE_IS_PRESERVED) == 0) { xmlUnlinkNode(tmp); xmlTextReaderFreeNode(reader, tmp); } else @@ -1394,7 +1394,7 @@ get_next_node: if ((oldstate == XML_TEXTREADER_ELEMENT) && (reader->node->type == XML_ELEMENT_NODE) && (reader->node->children == NULL) && - ((reader->node->extra & NODE_IS_EMPTY) == 0) + ((XML_NODE_GET_EXTRA(reader->node) & NODE_IS_EMPTY) == 0) #ifdef LIBXML_XINCLUDE_ENABLED && (reader->in_xinclude <= 0) #endif @@ -1408,7 +1408,7 @@ get_next_node: xmlTextReaderValidatePop(reader); #endif /* LIBXML_REGEXP_ENABLED */ if ((reader->preserves > 0) && - (reader->node->extra & NODE_IS_SPRESERVED)) + (XML_NODE_GET_EXTRA(reader->node) & NODE_IS_SPRESERVED)) reader->preserves--; reader->node = reader->node->next; reader->state = XML_TEXTREADER_ELEMENT; @@ -1424,7 +1424,7 @@ get_next_node: (reader->node->prev != NULL) && (reader->node->prev->type != XML_DTD_NODE)) { xmlNodePtr tmp = reader->node->prev; - if ((tmp->extra & NODE_IS_PRESERVED) == 0) { + if ((XML_NODE_GET_EXTRA(tmp) & NODE_IS_PRESERVED) == 0) { xmlUnlinkNode(tmp); xmlTextReaderFreeNode(reader, tmp); } @@ -1435,7 +1435,7 @@ get_next_node: if ((oldstate == XML_TEXTREADER_ELEMENT) && (reader->node->type == XML_ELEMENT_NODE) && (reader->node->children == NULL) && - ((reader->node->extra & NODE_IS_EMPTY) == 0)) {; + ((XML_NODE_GET_EXTRA(reader->node) & NODE_IS_EMPTY) == 0)) {; reader->state = XML_TEXTREADER_END; goto node_found; } @@ -1444,7 +1444,7 @@ get_next_node: xmlTextReaderValidatePop(reader); #endif /* LIBXML_REGEXP_ENABLED */ if ((reader->preserves > 0) && - (reader->node->extra & NODE_IS_SPRESERVED)) + (XML_NODE_GET_EXTRA(reader->node) & NODE_IS_SPRESERVED)) reader->preserves--; reader->node = reader->node->parent; if ((reader->node == NULL) || @@ -1471,7 +1471,7 @@ get_next_node: #endif (reader->entNr == 0) && (oldnode->type != XML_DTD_NODE) && - ((oldnode->extra & NODE_IS_PRESERVED) == 0)) { + ((XML_NODE_GET_EXTRA(oldnode) & NODE_IS_PRESERVED) == 0)) { xmlUnlinkNode(oldnode); xmlTextReaderFreeNode(reader, oldnode); } @@ -1484,7 +1484,7 @@ get_next_node: #endif (reader->entNr == 0) && (reader->node->last != NULL) && - ((reader->node->last->extra & NODE_IS_PRESERVED) == 0)) { + ((XML_NODE_GET_EXTRA(reader->node->last) & NODE_IS_PRESERVED) == 0)) { xmlNodePtr tmp = reader->node->last; xmlUnlinkNode(tmp); xmlTextReaderFreeNode(reader, tmp); @@ -1674,7 +1674,7 @@ xmlTextReaderNext(xmlTextReaderPtr reader) { return(xmlTextReaderRead(reader)); if (reader->state == XML_TEXTREADER_END || reader->state == XML_TEXTREADER_BACKTRACK) return(xmlTextReaderRead(reader)); - if (cur->extra & NODE_IS_EMPTY) + if (XML_NODE_GET_EXTRA(cur) & NODE_IS_EMPTY) return(xmlTextReaderRead(reader)); do { ret = xmlTextReaderRead(reader); @@ -3093,7 +3093,7 @@ xmlTextReaderIsEmptyElement(xmlTextReaderPtr reader) { if (reader->in_xinclude > 0) return(1); #endif - return((reader->node->extra & NODE_IS_EMPTY) != 0); + return((XML_NODE_GET_EXTRA(reader->node) & NODE_IS_EMPTY) != 0); } /** @@ -3957,15 +3957,15 @@ xmlTextReaderPreserve(xmlTextReaderPtr reader) { return(NULL); if ((cur->type != XML_DOCUMENT_NODE) && (cur->type != XML_DTD_NODE)) { - cur->extra |= NODE_IS_PRESERVED; - cur->extra |= NODE_IS_SPRESERVED; + XML_NODE_ADD_EXTRA(cur, NODE_IS_PRESERVED); + XML_NODE_ADD_EXTRA(cur, NODE_IS_SPRESERVED); } reader->preserves++; parent = cur->parent;; while (parent != NULL) { if (parent->type == XML_ELEMENT_NODE) - parent->extra |= NODE_IS_PRESERVED; + XML_NODE_ADD_EXTRA(parent, NODE_IS_PRESERVED); parent = parent->parent; } return(cur); diff --git a/xmlschemas.c b/xmlschemas.c index 05a12e0b..5d61deb2 100644 --- a/xmlschemas.c +++ b/xmlschemas.c @@ -5969,7 +5969,7 @@ xmlSchemaPValAttrNodeID(xmlSchemaParserCtxtPtr ctxt, xmlAttrPtr attr) /* * NOTE: the IDness might have already be declared in the DTD */ - if (attr->atype != XML_ATTRIBUTE_ID) { + if (XML_ATTR_GET_ATYPE(attr) != XML_ATTRIBUTE_ID) { xmlIDPtr res; xmlChar *strip; @@ -5992,7 +5992,7 @@ xmlSchemaPValAttrNodeID(xmlSchemaParserCtxtPtr ctxt, xmlAttrPtr attr) NULL, NULL, "Duplicate value '%s' of simple " "type 'xs:ID'", value, NULL); } else - attr->atype = XML_ATTRIBUTE_ID; + XML_ATTR_SET_ATYPE(attr, XML_ATTRIBUTE_ID); } } else if (ret > 0) { ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; diff --git a/xmlschemastypes.c b/xmlschemastypes.c index c6c93659..a85475db 100644 --- a/xmlschemastypes.c +++ b/xmlschemastypes.c @@ -2760,7 +2760,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, /* * NOTE: the IDness might have already be declared in the DTD */ - if (attr->atype != XML_ATTRIBUTE_ID) { + if (XML_ATTR_GET_ATYPE(attr) != XML_ATTRIBUTE_ID) { xmlIDPtr res; xmlChar *strip; @@ -2773,7 +2773,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, if (res == NULL) { ret = 2; } else { - attr->atype = XML_ATTRIBUTE_ID; + XML_ATTR_SET_ATYPE(attr, XML_ATTRIBUTE_ID); } } } @@ -2798,7 +2798,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, xmlFree(strip); } else xmlAddRef(NULL, node->doc, value, attr); - attr->atype = XML_ATTRIBUTE_IDREF; + XML_ATTR_SET_ATYPE(attr, XML_ATTRIBUTE_IDREF); } goto done; case XML_SCHEMAS_IDREFS: @@ -2812,7 +2812,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, (node->type == XML_ATTRIBUTE_NODE)) { xmlAttrPtr attr = (xmlAttrPtr) node; - attr->atype = XML_ATTRIBUTE_IDREFS; + XML_ATTR_SET_ATYPE(attr, XML_ATTRIBUTE_IDREFS); } goto done; case XML_SCHEMAS_ENTITY:{ @@ -2843,7 +2843,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, (node->type == XML_ATTRIBUTE_NODE)) { xmlAttrPtr attr = (xmlAttrPtr) node; - attr->atype = XML_ATTRIBUTE_ENTITY; + XML_ATTR_SET_ATYPE(attr, XML_ATTRIBUTE_ENTITY); } goto done; } @@ -2860,7 +2860,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, (node->type == XML_ATTRIBUTE_NODE)) { xmlAttrPtr attr = (xmlAttrPtr) node; - attr->atype = XML_ATTRIBUTE_ENTITIES; + XML_ATTR_SET_ATYPE(attr, XML_ATTRIBUTE_ENTITIES); } goto done; case XML_SCHEMAS_NOTATION:{ -- 2.49.0