Kaynağa Gözat

Check for malloc fails during node copying

Julius Pfrommer 6 yıl önce
ebeveyn
işleme
4d7af816dc
1 değiştirilmiş dosya ile 16 ekleme ve 12 silme
  1. 16 12
      src/server/ua_nodes.c

+ 16 - 12
src/server/ua_nodes.c

@@ -1,6 +1,6 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  *
  *    Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
  *    Copyright 2015-2016 (c) Sten Grüner
@@ -229,37 +229,41 @@ UA_Node_copy(const UA_Node *src, UA_Node *dst) {
 
 UA_Node *
 UA_Node_copy_alloc(const UA_Node *src) {
-    // use dstPtr to trick static code analysis in accepting dirty cast
-    void *dstPtr;
+    /* use dstPtr to trick static code analysis in accepting dirty cast */
+    size_t nodesize = 0;
     switch(src->nodeClass) {
         case UA_NODECLASS_OBJECT:
-            dstPtr = UA_malloc(sizeof(UA_ObjectNode));
+            nodesize = sizeof(UA_ObjectNode);
             break;
         case UA_NODECLASS_VARIABLE:
-            dstPtr =UA_malloc(sizeof(UA_VariableNode));
+            nodesize = sizeof(UA_VariableNode);
             break;
         case UA_NODECLASS_METHOD:
-            dstPtr = UA_malloc(sizeof(UA_MethodNode));
+            nodesize = sizeof(UA_MethodNode);
             break;
         case UA_NODECLASS_OBJECTTYPE:
-            dstPtr = UA_malloc(sizeof(UA_ObjectTypeNode));
+            nodesize = sizeof(UA_ObjectTypeNode);
             break;
         case UA_NODECLASS_VARIABLETYPE:
-            dstPtr = UA_malloc(sizeof(UA_VariableTypeNode));
+            nodesize = sizeof(UA_VariableTypeNode);
             break;
         case UA_NODECLASS_REFERENCETYPE:
-            dstPtr = UA_malloc(sizeof(UA_ReferenceTypeNode));
+            nodesize = sizeof(UA_ReferenceTypeNode);
             break;
         case UA_NODECLASS_DATATYPE:
-            dstPtr = UA_malloc(sizeof(UA_DataTypeNode));
+            nodesize = sizeof(UA_DataTypeNode);
             break;
         case UA_NODECLASS_VIEW:
-            dstPtr = UA_malloc(sizeof(UA_ViewNode));
+            nodesize = sizeof(UA_ViewNode);
             break;
         default:
             return NULL;
     }
-    UA_Node *dst = (UA_Node*)dstPtr;
+
+    UA_Node *dst = (UA_Node*)UA_calloc(1,nodesize);
+    if(!dst)
+        return NULL;
+
     dst->nodeClass = src->nodeClass;
 
     UA_StatusCode retval = UA_Node_copy(src, dst);