1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2024-10-26 03:55:04 +03:00

fuzz: Don't unlink DTD when replacing nodes

OP_XML_REPLACE_NODE needs the same check as OP_XML_UNLINK_NODE.
This commit is contained in:
Nick Wellnhofer 2024-10-10 12:14:47 +02:00
parent a4c16a140c
commit bf3619c328

View File

@ -2287,7 +2287,7 @@ LLVMFuzzerTestOneInput(const char *data, size_t size) {
case OP_XML_REPLACE_NODE: {
xmlNodePtr old, oldParent, node, oldNodeParent, result;
xmlDocPtr oldNodeDoc;
xmlDocPtr oldDoc, oldNodeDoc;
startOp("xmlReplaceNode");
old = getNode(0);
@ -2296,8 +2296,18 @@ LLVMFuzzerTestOneInput(const char *data, size_t size) {
/*
* Unlinking DTD children can cause invalid references
* which would be expensive to fix.
*
* Don't unlink DTD if it is the internal or external
* subset of the document.
*/
if (isDtdChild(old))
old = old ? old->parent : NULL;
oldDoc = old ? old->doc : NULL;
if (old != NULL &&
(isDtdChild(old) ||
(old->type == XML_DTD_NODE &&
oldDoc != NULL &&
((xmlDtdPtr) old == oldDoc->intSubset ||
(xmlDtdPtr) old == oldDoc->extSubset))))
old = NULL;
if (old != NULL && !isValidChild(old->parent, node))
node = NULL;