diff options
author | David Kilzer <ddkilzer@apple.com> | 2022-03-19 17:17:40 -0700 |
---|---|---|
committer | David Kilzer <ddkilzer@apple.com> | 2022-05-25 10:04:59 -0700 |
commit | 300e19932f273f871a88499f030ebbc1ac0ddfb0 (patch) | |
tree | c0aa38d4c52b301120064945b97252122f7d1f97 | |
parent | 4bc3ebf3eaba352fbbce2ef70ad00a3c7752478a (diff) | |
download | libxml2-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.c | 12 |
1 files changed, 12 insertions, 0 deletions
@@ -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(). */ |