]> git.kaiwu.me - njs.git/commitdiff
XML: fixed memory leak when exception happens in node.addChild().
authorDmitry Volyntsev <xeioex@nginx.com>
Wed, 1 Mar 2023 04:34:31 +0000 (20:34 -0800)
committerDmitry Volyntsev <xeioex@nginx.com>
Wed, 1 Mar 2023 04:34:31 +0000 (20:34 -0800)
The issue was introduced in 3891f338e2c9.

Found by Coverity (CID 1521487).

external/njs_xml_module.c

index b8203cce5d2919811e58c11f138141ae60cb5719..d30ff98be7137341cc771e6040a2a7a424b06b3c 100644 (file)
@@ -708,7 +708,7 @@ static njs_int_t
 njs_xml_node_ext_add_child(njs_vm_t *vm, njs_value_t *args,
     njs_uint_t nargs, njs_index_t unused)
 {
-    xmlNode    *current, *node, *copy;
+    xmlNode    *current, *node, *copy, *rnode;
     njs_int_t  ret;
 
     current = njs_vm_external(vm, njs_xml_node_proto_id, njs_argument(args, 0));
@@ -717,26 +717,27 @@ njs_xml_node_ext_add_child(njs_vm_t *vm, njs_value_t *args,
         return NJS_ERROR;
     }
 
+    node = njs_xml_external_node(vm, njs_arg(args, nargs, 1));
+    if (njs_slow_path(node == NULL)) {
+        njs_vm_error(vm, "node is not a XMLNode object");
+        return NJS_ERROR;
+    }
+
     copy = xmlDocCopyNode(current, current->doc, 1);
     if (njs_slow_path(copy == NULL)) {
         njs_vm_error(vm, "xmlDocCopyNode() failed");
         return NJS_ERROR;
     }
 
-    node = njs_xml_external_node(vm, njs_arg(args, nargs, 1));
-    if (njs_slow_path(node == NULL)) {
-        njs_vm_error(vm, "node is not a XMLNode object");
-        goto error;
-    }
-
     node = xmlDocCopyNode(node, current->doc, 1);
     if (njs_slow_path(node == NULL)) {
         njs_vm_error(vm, "xmlDocCopyNode() failed");
         goto error;
     }
 
-    node = xmlAddChild(copy, node);
-    if (njs_slow_path(node == NULL)) {
+    rnode = xmlAddChild(copy, node);
+    if (njs_slow_path(rnode == NULL)) {
+        xmlFreeNode(node);
         njs_vm_error(vm, "xmlAddChild() failed");
         goto error;
     }
@@ -744,7 +745,7 @@ njs_xml_node_ext_add_child(njs_vm_t *vm, njs_value_t *args,
     ret = xmlReconciliateNs(current->doc, copy);
     if (njs_slow_path(ret == -1)) {
         njs_vm_error(vm, "xmlReconciliateNs() failed");
-        return NJS_ERROR;
+        goto error;
     }
 
     njs_value_undefined_set(njs_vm_retval(vm));
@@ -753,10 +754,6 @@ njs_xml_node_ext_add_child(njs_vm_t *vm, njs_value_t *args,
 
 error:
 
-    if (node != NULL) {
-        xmlFreeNode(node);
-    }
-
     xmlFreeNode(copy);
 
     return NJS_ERROR;