summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kilzer <ddkilzer@apple.com>2022-03-19 17:17:40 -0700
committerDavid Kilzer <ddkilzer@apple.com>2022-05-25 10:04:59 -0700
commit300e19932f273f871a88499f030ebbc1ac0ddfb0 (patch)
treec0aa38d4c52b301120064945b97252122f7d1f97
parent4bc3ebf3eaba352fbbce2ef70ad00a3c7752478a (diff)
downloadlibxml2-ddkilzer/add-fuzzing-asserts-to-xmlSetTreeDoc.tar.gz
Add fuzzing asserts to xmlSetTreeDoc()ddkilzer/add-fuzzing-asserts-to-xmlSetTreeDoc
* tree.c: (xmlSetTreeDoc): - When xmlSetTreeDoc() has to change documents, the calling code probably has a bug, so assert when those conditions are hit. This is a follow-up to commit 4bc3ebf3.
-rw-r--r--tree.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/tree.c b/tree.c
index 99eef30e..7baedef5 100644
--- a/tree.c
+++ b/tree.c
@@ -18,6 +18,7 @@
#define IN_LIBXML
#include "libxml.h"
+#include <assert.h>
#include <string.h> /* for memset() only ! */
#include <stddef.h>
#include <limits.h>
@@ -2850,6 +2851,10 @@ xmlSetTreeDoc(xmlNodePtr tree, xmlDocPtr doc) {
xmlRemoveID(tree->doc, prop);
}
+#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
+ if (prop->doc)
+ assert(xmlDictOwns(prop->doc->dict, prop->name) != 1);
+#endif
if (prop->doc != doc) {
xmlDictPtr oldPropDict = prop->doc ? prop->doc->dict : NULL;
prop->name = _copyStringForNewDictIfNeeded(oldPropDict, newDict, prop->name);
@@ -2884,6 +2889,13 @@ xmlSetTreeDoc(xmlNodePtr tree, xmlDocPtr doc) {
xmlSetListDoc(tree->children, doc);
}
+#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
+ if (tree->doc) {
+ assert(xmlDictOwns(tree->doc->dict, tree->name) != 1);
+ assert(xmlDictOwns(tree->doc->dict, tree->content) != 1);
+ }
+ assert(tree->ns == NULL);
+#endif
tree->name = _copyStringForNewDictIfNeeded(oldTreeDict, newDict, tree->name);
tree->content = (xmlChar *)_copyStringForNewDictIfNeeded(oldTreeDict, NULL, tree->content);
/* FIXME: tree->ns should be updated as in xmlStaticCopyNode(). */