tree: Fix xmlTextMerge with NULL args
Restore pre-2.13 behavior. Fixes #875.
diff --git a/fuzz/api.c b/fuzz/api.c
index ff3cfd7..ba738db 100644
--- a/fuzz/api.c
+++ b/fuzz/api.c
@@ -2461,11 +2461,14 @@
first = getNode(0);
second = getNode(1);
argsOk =
- (first != NULL && first->type == XML_TEXT_NODE &&
- second != NULL && second->type == XML_TEXT_NODE &&
- first != second &&
- first->name == second->name);
- if (argsOk) {
+ first == NULL ?
+ second != NULL :
+ second == NULL ||
+ (first->type == XML_TEXT_NODE &&
+ second->type == XML_TEXT_NODE &&
+ first != second &&
+ first->name == second->name);
+ if (argsOk && second != NULL) {
if (second->parent != NULL)
parent = second->parent;
else
@@ -2474,7 +2477,7 @@
}
res = xmlTextMerge(first, second);
oomReport = (argsOk && res == NULL);
- if (res != NULL) {
+ if (res != NULL && first != NULL) {
removeNode(second);
dropNode(parent);
checkContent(first);
diff --git a/tree.c b/tree.c
index 246470a..7454b07 100644
--- a/tree.c
+++ b/tree.c
@@ -5790,15 +5790,21 @@
* @first: the first text node
* @second: the second text node being merged
*
- * Merge the second text node into the first. The second node is
- * unlinked and freed.
+ * Merge the second text node into the first. If @first is NULL,
+ * @second is returned. Otherwise, the second node is unlinked and
+ * freed.
*
* Returns the first text node augmented or NULL in case of error.
*/
xmlNodePtr
xmlTextMerge(xmlNodePtr first, xmlNodePtr second) {
- if ((first == NULL) || (first->type != XML_TEXT_NODE) ||
- (second == NULL) || (second->type != XML_TEXT_NODE) ||
+ if (first == NULL)
+ return(second);
+ if (second == NULL)
+ return(first);
+
+ if ((first->type != XML_TEXT_NODE) ||
+ (second->type != XML_TEXT_NODE) ||
(first == second) ||
(first->name != second->name))
return(NULL);