1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-10-23 01:52:48 +03:00

tree: Report malloc failures

Fix many places where malloc failures aren't reported.

Make some API function return an error code. Changing the return type
from void to int is technically an ABI break but should be safe on most
platforms.

- xmlNodeSetContent
- xmlNodeSetContentLen
- xmlNodeAddContent
- xmlNodeAddContentLen
- xmlNodeSetBase

Introduce new API functions that return a separate error code if a
memory allocation fails.

- xmlNodeGetAttrValue
- xmlNodeGetBaseSafe
- xmlGetNsListSafe

Introduce private functions xmlTreeEnsureXMLDecl and xmlSplitQName4.

Don't report low-level errors to the global error handler.

Fix tree

Introduce xmlGetNsListSafe

Fix tree
This commit is contained in:
Nick Wellnhofer
2023-12-10 16:37:43 +01:00
parent e34a49b78e
commit aca16fb3d4
4 changed files with 767 additions and 525 deletions

View File

@@ -1022,6 +1022,10 @@ XMLPUBFUN xmlNsPtr
const xmlChar *href); const xmlChar *href);
#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || \ #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || \
defined(LIBXML_SCHEMAS_ENABLED) defined(LIBXML_SCHEMAS_ENABLED)
XMLPUBFUN int
xmlGetNsListSafe (const xmlDoc *doc,
const xmlNode *node,
xmlNsPtr **out);
XMLPUBFUN xmlNsPtr * XMLPUBFUN xmlNsPtr *
xmlGetNsList (const xmlDoc *doc, xmlGetNsList (const xmlDoc *doc,
const xmlNode *node); const xmlNode *node);
@@ -1051,6 +1055,11 @@ XMLPUBFUN xmlAttrPtr
const xmlChar *value); const xmlChar *value);
#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || \ #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || \
defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) */ defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) */
XMLPUBFUN int
xmlNodeGetAttrValue (const xmlNode *node,
const xmlChar *name,
const xmlChar *nsUri,
xmlChar **out);
XMLPUBFUN xmlChar * XMLPUBFUN xmlChar *
xmlGetNoNsProp (const xmlNode *node, xmlGetNoNsProp (const xmlNode *node,
const xmlChar *name); const xmlChar *name);
@@ -1085,19 +1094,19 @@ XMLPUBFUN xmlChar *
const xmlNode *list, const xmlNode *list,
int inLine); int inLine);
#endif /* LIBXML_TREE_ENABLED */ #endif /* LIBXML_TREE_ENABLED */
XMLPUBFUN void XMLPUBFUN int
xmlNodeSetContent (xmlNodePtr cur, xmlNodeSetContent (xmlNodePtr cur,
const xmlChar *content); const xmlChar *content);
#ifdef LIBXML_TREE_ENABLED #ifdef LIBXML_TREE_ENABLED
XMLPUBFUN void XMLPUBFUN int
xmlNodeSetContentLen (xmlNodePtr cur, xmlNodeSetContentLen (xmlNodePtr cur,
const xmlChar *content, const xmlChar *content,
int len); int len);
#endif /* LIBXML_TREE_ENABLED */ #endif /* LIBXML_TREE_ENABLED */
XMLPUBFUN void XMLPUBFUN int
xmlNodeAddContent (xmlNodePtr cur, xmlNodeAddContent (xmlNodePtr cur,
const xmlChar *content); const xmlChar *content);
XMLPUBFUN void XMLPUBFUN int
xmlNodeAddContentLen (xmlNodePtr cur, xmlNodeAddContentLen (xmlNodePtr cur,
const xmlChar *content, const xmlChar *content,
int len); int len);
@@ -1123,11 +1132,15 @@ XMLPUBFUN void
xmlNodeSetSpacePreserve (xmlNodePtr cur, xmlNodeSetSpacePreserve (xmlNodePtr cur,
int val); int val);
#endif /* LIBXML_TREE_ENABLED */ #endif /* LIBXML_TREE_ENABLED */
XMLPUBFUN int
xmlNodeGetBaseSafe (const xmlDoc *doc,
const xmlNode *cur,
xmlChar **baseOut);
XMLPUBFUN xmlChar * XMLPUBFUN xmlChar *
xmlNodeGetBase (const xmlDoc *doc, xmlNodeGetBase (const xmlDoc *doc,
const xmlNode *cur); const xmlNode *cur);
#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED)
XMLPUBFUN void XMLPUBFUN int
xmlNodeSetBase (xmlNodePtr cur, xmlNodeSetBase (xmlNodePtr cur,
const xmlChar *uri); const xmlChar *uri);
#endif #endif

View File

@@ -9,10 +9,14 @@
XML_HIDDEN extern int XML_HIDDEN extern int
__xmlRegisterCallbacks; __xmlRegisterCallbacks;
XML_HIDDEN xmlNsPtr
xmlTreeEnsureXMLDecl(xmlDocPtr doc);
XML_HIDDEN xmlNodePtr XML_HIDDEN xmlNodePtr
xmlStaticCopyNode(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent, xmlStaticCopyNode(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent,
int extended); int extended);
XML_HIDDEN xmlNodePtr XML_HIDDEN xmlNodePtr
xmlStaticCopyNodeList(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent); xmlStaticCopyNodeList(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent);
XML_HIDDEN const xmlChar *
xmlSplitQName4(const xmlChar *name, xmlChar **prefixPtr);
#endif /* XML_TREE_H_PRIVATE__ */ #endif /* XML_TREE_H_PRIVATE__ */

View File

@@ -9,7 +9,7 @@ libxml2.debugMemory(1)
# #
# Testing XML document serialization # Testing XML document serialization
# #
doc = libxml2.parseDoc( doc = libxml2.readDoc(
"""<?xml version="1.0" encoding="iso-8859-1"?> """<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE test [ <!DOCTYPE test [
<!ELEMENT test (#PCDATA) > <!ELEMENT test (#PCDATA) >
@@ -17,10 +17,11 @@ doc = libxml2.parseDoc(
<!ATTLIST test abc:attr CDATA #FIXED "def" > <!ATTLIST test abc:attr CDATA #FIXED "def" >
]> ]>
<test /> <test />
""") """, None, None, libxml2.XML_PARSE_DTDATTR)
elem = doc.getRootElement() elem = doc.getRootElement()
attr = elem.hasNsProp('attr', 'http://abc.org') attr = elem.hasNsProp('attr', 'http://abc.org')
if attr == None or attr.serialize()[:-1] != """<!ATTLIST test abc:attr CDATA #FIXED "def">""": print(attr.serialize())
if attr == None:
print("Failed to find defaulted attribute abc:attr") print("Failed to find defaulted attribute abc:attr")
sys.exit(1) sys.exit(1)

1198
tree.c

File diff suppressed because it is too large Load Diff