Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libxml2 for openSUSE:Factory checked in at 2025-07-20 15:27:48 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libxml2 (Old) and /work/SRC/openSUSE:Factory/.libxml2.new.8875 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libxml2" Sun Jul 20 15:27:48 2025 rev:136 rq:1294382 version:2.13.8 Changes: -------- --- /work/SRC/openSUSE:Factory/libxml2/libxml2.changes 2025-07-08 15:27:50.591245371 +0200 +++ /work/SRC/openSUSE:Factory/.libxml2.new.8875/libxml2.changes 2025-07-20 15:27:50.024994971 +0200 @@ -1,0 +2,8 @@ +Fri Jul 18 08:58:47 UTC 2025 - pgaj...@suse.com + +- security update +- added patches + CVE-2025-7425 [bsc#1246296], Heap Use-After-Free in libxslt caused by atype corruption in xmlAttrPtr + + libxml2-CVE-2025-7425.patch + +------------------------------------------------------------------- New: ---- libxml2-CVE-2025-7425.patch ----------(New B)---------- New: CVE-2025-7425 [bsc#1246296], Heap Use-After-Free in libxslt caused by atype corruption in xmlAttrPtr + libxml2-CVE-2025-7425.patch ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libxml2.spec ++++++ --- /var/tmp/diff_new_pack.05t0L8/_old 2025-07-20 15:27:51.105039665 +0200 +++ /var/tmp/diff_new_pack.05t0L8/_new 2025-07-20 15:27:51.105039665 +0200 @@ -60,6 +60,8 @@ Patch2002: libxml2-CVE-2025-49794,49796.patch # CVE-2025-49795 [bsc#1244555], null pointer dereference may lead to Denial of service (DoS) Patch2003: libxml2-CVE-2025-49795.patch +# CVE-2025-7425 [bsc#1246296], Heap Use-After-Free in libxslt caused by atype corruption in xmlAttrPtr +Patch2004: libxml2-CVE-2025-7425.patch # BuildRequires: fdupes BuildRequires: pkgconfig ++++++ libxml2-CVE-2025-7425.patch ++++++ >From b7d2ad6e1b376c10edffcb0973485c861dc89559 Mon Sep 17 00:00:00 2001 From: David Kilzer <ddkil...@apple.com> 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 | 2 +- SAX2.c | 14 +++++++------- include/libxml/tree.h | 14 +++++++++++++- parser.c | 10 +++++----- runxmlconf.c | 4 ++-- tree.c | 14 +++++++------- valid.c | 14 +++++++------- xmlreader.c | 30 +++++++++++++++--------------- xmlschemas.c | 2 +- xmlschemastypes.c | 10 +++++----- 10 files changed, 63 insertions(+), 51 deletions(-) Index: libxml2-2.13.8/HTMLparser.c =================================================================== --- libxml2-2.13.8.orig/HTMLparser.c +++ libxml2-2.13.8/HTMLparser.c @@ -2367,7 +2367,7 @@ htmlNewDocNoDtD(const xmlChar *URI, cons cur->refs = NULL; cur->_private = NULL; cur->charset = XML_CHAR_ENCODING_UTF8; - cur->properties = XML_DOC_HTML | XML_DOC_USERBUILT; + XML_DOC_SET_PROPERTIES(cur, XML_DOC_HTML | XML_DOC_USERBUILT); if ((ExternalID != NULL) || (URI != NULL)) { xmlDtdPtr intSubset; Index: libxml2-2.13.8/SAX2.c =================================================================== --- libxml2-2.13.8.orig/SAX2.c +++ libxml2-2.13.8/SAX2.c @@ -831,16 +831,16 @@ xmlSAX2StartDocument(void *ctx) xmlSAX2ErrMemory(ctxt); return; } - ctxt->myDoc->properties = XML_DOC_HTML; + XML_DOC_SET_PROPERTIES(ctxt->myDoc, XML_DOC_HTML); ctxt->myDoc->parseFlags = ctxt->options; } else #endif { 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; doc->standalone = ctxt->standalone; } else { Index: libxml2-2.13.8/include/libxml/tree.h =================================================================== --- libxml2-2.13.8.orig/include/libxml/tree.h +++ libxml2-2.13.8/include/libxml/tree.h @@ -370,7 +370,6 @@ struct _xmlElement { #endif }; - /** * XML_LOCAL_NAMESPACE: * @@ -458,6 +457,10 @@ struct _xmlAttr { * An XML ID instance. */ +#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)))) + typedef struct _xmlID xmlID; typedef xmlID *xmlIDPtr; struct _xmlID { @@ -547,6 +550,11 @@ typedef enum { XML_DOC_HTML = 1<<7 /* parsed or built HTML document */ } xmlDocProperties; +#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)))) + /** * xmlDoc: * @@ -590,6 +598,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; Index: libxml2-2.13.8/parser.c =================================================================== --- libxml2-2.13.8.orig/parser.c +++ libxml2-2.13.8/parser.c @@ -5791,7 +5791,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt xmlErrMemory(ctxt); goto done; } - 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, @@ -5849,7 +5849,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt xmlErrMemory(ctxt); goto done; } - ctxt->myDoc->properties = XML_DOC_INTERNAL; + XML_DOC_SET_PROPERTIES(ctxt->myDoc, XML_DOC_INTERNAL); } if (ctxt->myDoc->intSubset == NULL) { @@ -7269,7 +7269,7 @@ xmlParseExternalSubset(xmlParserCtxtPtr xmlErrMemory(ctxt); 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) == NULL)) { @@ -7535,7 +7535,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) if (ctxt->parseMode == XML_PARSE_READER) { /* Needed for reader */ - copy->extra = cur->extra; + XML_NODE_SET_EXTRA(copy, XML_NODE_GET_EXTRA(cur)); /* Maybe needed for reader */ copy->_private = cur->_private; } @@ -11869,7 +11869,7 @@ xmlIOParseDTD(xmlSAXHandlerPtr sax, xmlP xmlErrMemory(ctxt); return(NULL); } - ctxt->myDoc->properties = XML_DOC_INTERNAL; + XML_DOC_SET_PROPERTIES(ctxt->myDoc, XML_DOC_INTERNAL); ctxt->myDoc->extSubset = xmlNewDtd(ctxt->myDoc, BAD_CAST "none", BAD_CAST "none", BAD_CAST "none"); Index: libxml2-2.13.8/runxmlconf.c =================================================================== --- libxml2-2.13.8.orig/runxmlconf.c +++ libxml2-2.13.8/runxmlconf.c @@ -190,7 +190,7 @@ xmlconfTestInvalid(const char *id, const 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++; @@ -223,7 +223,7 @@ xmlconfTestValid(const char *id, const c 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++; Index: libxml2-2.13.8/tree.c =================================================================== --- libxml2-2.13.8.orig/tree.c +++ libxml2-2.13.8/tree.c @@ -1117,7 +1117,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 @@ -1931,7 +1931,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); @@ -2779,7 +2779,7 @@ xmlNodeSetDoc(xmlNodePtr node, xmlDocPtr * TODO: ID attributes should also be added to the new * document, but it's not clear how to handle clashes. */ - if (attr->atype == XML_ATTRIBUTE_ID) + if (XML_ATTR_GET_ATYPE(attr) == XML_ATTRIBUTE_ID) xmlRemoveID(oldDoc, attr); break; @@ -6985,9 +6985,9 @@ xmlSetNsProp(xmlNodePtr node, xmlNsPtr n return(NULL); } - 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); @@ -7007,7 +7007,7 @@ xmlSetNsProp(xmlNodePtr node, xmlNsPtr n tmp = tmp->next; } } - if ((prop->atype == XML_ATTRIBUTE_ID) && + if ((XML_ATTR_GET_ATYPE(prop) == XML_ATTRIBUTE_ID) && (xmlAddIDSafe(prop, value) < 0)) { return(NULL); } @@ -9112,7 +9112,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. */ Index: libxml2-2.13.8/valid.c =================================================================== --- libxml2-2.13.8.orig/valid.c +++ libxml2-2.13.8/valid.c @@ -2300,7 +2300,7 @@ xmlFreeID(xmlIDPtr id) { DICT_FREE(id->name) if (id->attr != NULL) { id->attr->id = NULL; - id->attr->atype = 0; + XML_ATTR_CLEAR_ATYPE(id->attr); } xmlFree(id); @@ -2379,7 +2379,7 @@ xmlAddIDInternal(xmlAttrPtr attr, const id->attr = attr; id->lineno = xmlGetLineNo(attr->parent); - attr->atype = XML_ATTRIBUTE_ID; + XML_ATTR_SET_ATYPE(attr, XML_ATTRIBUTE_ID); attr->id = id; return(ret); @@ -3257,7 +3257,7 @@ xmlValidNormalizeString(xmlChar *str) { 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 @@ -3287,7 +3287,7 @@ xmlIsDocNameStartChar(xmlDocPtr doc, int 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 @@ -4285,9 +4285,9 @@ xmlValidateOneAttribute(xmlValidCtxtPtr attr->name, elem->name, NULL); return(0); } - if (attr->atype == XML_ATTRIBUTE_ID) + if (XML_ATTR_GET_ATYPE(attr) == XML_ATTRIBUTE_ID) xmlRemoveID(doc, attr); - attr->atype = attrDecl->atype; + XML_ATTR_SET_ATYPE(attr, attrDecl->atype); val = xmlValidateAttributeValueInternal(doc, attrDecl->atype, value); if (val == 0) { @@ -6315,7 +6315,7 @@ xmlValidateRef(xmlRefPtr ref, xmlValidCt 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, @@ -6323,7 +6323,7 @@ xmlValidateRef(xmlRefPtr ref, xmlValidCt 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); Index: libxml2-2.13.8/xmlreader.c =================================================================== --- libxml2-2.13.8.orig/xmlreader.c +++ libxml2-2.13.8/xmlreader.c @@ -632,7 +632,7 @@ xmlTextReaderStartElement(void *ctx, con 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; @@ -691,7 +691,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; @@ -1096,7 +1096,7 @@ skip_children: 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 @@ -1307,7 +1307,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 @@ -1322,7 +1322,7 @@ get_next_node: return(-1); #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; @@ -1338,7 +1338,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) { if (oldnode == tmp) oldnode = NULL; xmlUnlinkNode(tmp); @@ -1351,7 +1351,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; } @@ -1363,7 +1363,7 @@ get_next_node: } #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) || @@ -1390,7 +1390,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); } @@ -1403,7 +1403,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); @@ -1600,7 +1600,7 @@ xmlTextReaderNext(xmlTextReaderPtr reade 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); @@ -3099,7 +3099,7 @@ xmlTextReaderIsEmptyElement(xmlTextReade 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); } /** @@ -3971,15 +3971,15 @@ xmlTextReaderPreserve(xmlTextReaderPtr r 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); Index: libxml2-2.13.8/xmlschemas.c =================================================================== --- libxml2-2.13.8.orig/xmlschemas.c +++ libxml2-2.13.8/xmlschemas.c @@ -5897,7 +5897,7 @@ xmlSchemaPValAttrNodeID(xmlSchemaParserC /* * 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) { xmlChar *strip; int res; Index: libxml2-2.13.8/xmlschemastypes.c =================================================================== --- libxml2-2.13.8.orig/xmlschemastypes.c +++ libxml2-2.13.8/xmlschemastypes.c @@ -3051,7 +3051,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr /* * 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) { xmlChar *strip; int res; @@ -3089,7 +3089,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr 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: @@ -3103,7 +3103,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr (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:{ @@ -3134,7 +3134,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr (node->type == XML_ATTRIBUTE_NODE)) { xmlAttrPtr attr = (xmlAttrPtr) node; - attr->atype = XML_ATTRIBUTE_ENTITY; + XML_ATTR_SET_ATYPE(attr, XML_ATTRIBUTE_ENTITY); } goto done; } @@ -3151,7 +3151,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr (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:{