Browse Source

Fixed several issues reported by coverity and scan-build.

ichrispa 9 years ago
parent
commit
e96d599acb
2 changed files with 89 additions and 72 deletions
  1. 68 58
      src/client/ua_client.c
  2. 21 14
      src/server/ua_server_addressspace.c

+ 68 - 58
src/client/ua_client.c

@@ -1069,14 +1069,14 @@ UA_StatusCode UA_Client_deleteNode(UA_Client *client, UA_NodeId nodeId) {
   drq->nodesToDelete[0].deleteTargetReferences = UA_TRUE;
   UA_NodeId_copy(&nodeId, &drq->nodesToDelete[0].nodeId);
   drs = UA_Client_deleteNodes(client, drq);
+  UA_DeleteNodesRequest_delete(drq);
   
-  if (drs.responseHeader.serviceResult != UA_STATUSCODE_GOOD || drs.resultsSize < 1)
+  if (drs.responseHeader.serviceResult != UA_STATUSCODE_GOOD || drs.resultsSize < 1) {
+    UA_DeleteNodesResponse_deleteMembers(&drs);
     return drs.responseHeader.serviceResult;
-  
-  retval = drs.results[0];
-    
-  UA_DeleteNodesRequest_delete(drq);
+  }
   UA_DeleteNodesResponse_deleteMembers(&drs);
+  retval = drs.results[0];
   return retval;
 }
 
@@ -1131,12 +1131,10 @@ UA_StatusCode UA_Client_addObjectNode(UA_Client *client, UA_NodeId reqId, UA_Qua
                                       UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
                                       UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition, UA_NodeId *createdNodeId) {
     UA_AddNodesRequest adReq;
-    UA_StatusCode retval;
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
     UA_AddNodesRequest_init(&adReq);
 
-    UA_AddNodesResponse *adRes;
-    adRes = UA_AddNodesResponse_new();
-    UA_AddNodesResponse_init(adRes);
+    UA_AddNodesResponse *adRes  = UA_AddNodesResponse_new();
 
     UA_ObjectAttributes vAtt;
     UA_ObjectAttributes_init(&vAtt);
@@ -1155,10 +1153,10 @@ UA_StatusCode UA_Client_addObjectNode(UA_Client *client, UA_NodeId reqId, UA_Qua
     
     if(adRes->responseHeader.serviceResult != UA_STATUSCODE_GOOD || adRes->resultsSize == 0)
       retval = adRes->responseHeader.serviceResult;
-    retval = adRes->results[0].statusCode;
+    retval |= adRes->results[0].statusCode;
     if(createdNodeId != NULL)
       UA_NodeId_copy(&adRes->results[0].addedNodeId, createdNodeId);
-    UA_AddNodesResponse_deleteMembers(adRes);
+    UA_AddNodesResponse_delete(adRes);
     return retval;
 }
 
@@ -1166,12 +1164,10 @@ UA_StatusCode UA_Client_addVariableNode(UA_Client *client, UA_NodeId reqId, UA_Q
                                         UA_LocalizedText description, UA_ExpandedNodeId parentNodeId, UA_NodeId referenceTypeId,
                                         UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_Variant *value, UA_NodeId *createdNodeId) {
     UA_AddNodesRequest adReq;
-    UA_StatusCode retval;
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
     UA_AddNodesRequest_init(&adReq);
     
-    UA_AddNodesResponse *adRes;
-    adRes = UA_AddNodesResponse_new();
-    UA_AddNodesResponse_init(adRes);
+    UA_AddNodesResponse *adRes = UA_AddNodesResponse_new();
     
     UA_VariableAttributes vAtt;
     UA_VariableAttributes_init(&vAtt);
@@ -1204,17 +1200,17 @@ UA_StatusCode UA_Client_addVariableNode(UA_Client *client, UA_NodeId reqId, UA_Q
         // These are defined by the variant
         //vAtt.arrayDimensionsSize  = value->arrayDimensionsSize;
         //vAtt.arrayDimensions      = NULL;
+        UA_NodeId_copy(&value->type->typeId, &(vAtt.dataType));
     }
-    UA_NodeId_copy(&value->type->typeId, &(vAtt.dataType));
     
     ADDNODES_PACK_AND_SEND(adReq,vAtt,VARIABLE);
     
     if(adRes->responseHeader.serviceResult != UA_STATUSCODE_GOOD || adRes->resultsSize == 0)
       retval = adRes->responseHeader.serviceResult;
-    retval = adRes->results[0].statusCode;
+    retval |= adRes->results[0].statusCode;
     if(createdNodeId != NULL)
       UA_NodeId_copy(&adRes->results[0].addedNodeId, createdNodeId);
-    UA_AddNodesResponse_deleteMembers(adRes);
+    UA_AddNodesResponse_delete(adRes);
     return retval;
 }
 
@@ -1223,12 +1219,10 @@ UA_StatusCode UA_Client_addReferenceTypeNode( UA_Client *client, UA_NodeId reqId
                                               UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition,
                                               UA_LocalizedText inverseName, UA_NodeId *createdNodeId ) {
     UA_AddNodesRequest adReq;
-    UA_StatusCode retval;
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
     UA_AddNodesRequest_init(&adReq);
     
-    UA_AddNodesResponse *adRes;
-    adRes = UA_AddNodesResponse_new();
-    UA_AddNodesResponse_init(adRes);
+    UA_AddNodesResponse *adRes = UA_AddNodesResponse_new();
     
     UA_ReferenceTypeAttributes vAtt;
     UA_ReferenceTypeAttributes_init(&vAtt);
@@ -1252,10 +1246,10 @@ UA_StatusCode UA_Client_addReferenceTypeNode( UA_Client *client, UA_NodeId reqId
     
     if(adRes->responseHeader.serviceResult != UA_STATUSCODE_GOOD || adRes->resultsSize == 0)
       retval = adRes->responseHeader.serviceResult;
-    retval = adRes->results[0].statusCode;
+    retval |= adRes->results[0].statusCode;
     if(createdNodeId != NULL)
       UA_NodeId_copy(&adRes->results[0].addedNodeId, createdNodeId);
-    UA_AddNodesResponse_deleteMembers(adRes);
+    UA_AddNodesResponse_delete(adRes);
     return retval;
 }
 
@@ -1264,11 +1258,10 @@ UA_StatusCode UA_Client_addObjectTypeNode(UA_Client *client, UA_NodeId reqId, UA
                                           UA_UInt32 userWriteMask, UA_UInt32 writeMask, UA_ExpandedNodeId typeDefinition, UA_Boolean isAbstract,
                                           UA_NodeId *createdNodeId) {
     UA_AddNodesRequest adReq;
-    UA_StatusCode retval;
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
     UA_AddNodesRequest_init(&adReq);
     
-    UA_AddNodesResponse *adRes;
-    adRes = UA_AddNodesResponse_new();
+    UA_AddNodesResponse *adRes = UA_AddNodesResponse_new();
     UA_AddNodesResponse_init(adRes);
     
     UA_ObjectTypeAttributes vAtt;
@@ -1289,10 +1282,10 @@ UA_StatusCode UA_Client_addObjectTypeNode(UA_Client *client, UA_NodeId reqId, UA
     
     if(adRes->responseHeader.serviceResult != UA_STATUSCODE_GOOD || adRes->resultsSize == 0)
       retval = adRes->responseHeader.serviceResult;
-    retval = adRes->results[0].statusCode;
+    retval |= adRes->results[0].statusCode;
     if(createdNodeId != NULL)
       UA_NodeId_copy(&adRes->results[0].addedNodeId, createdNodeId);
-    UA_AddNodesResponse_deleteMembers(adRes);
+    UA_AddNodesResponse_delete(adRes);
     return retval;
 }
 
@@ -1432,11 +1425,13 @@ UA_Client_appendObjectNodeAttributes(UA_Client *client, void *dst) {
     UA_NodeId_copy(&target->nodeId, &rrq->nodesToRead[i].nodeId);
   }
   rrs = UA_Client_read(client, rrq);
-  UA_ReadRequest_delete(rrq);
   if (rrs.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-    return rrs.responseHeader.serviceResult;
+    retval =  rrs.responseHeader.serviceResult;
   if (rrs.resultsSize != rrq->nodesToReadSize)
-    return rrs.responseHeader.serviceResult;
+    retval = rrs.responseHeader.serviceResult;
+  UA_ReadRequest_delete(rrq);
+  if (!(retval == UA_STATUSCODE_GOOD))
+    return retval;
   
   if (rrs.results[0].value.data != NULL)
     UA_Byte_copy((UA_Byte *) rrs.results[0].value.data, &target->eventNotifier);
@@ -1463,11 +1458,13 @@ UA_Client_appendObjectTypeNodeAttributes(UA_Client *client, void *dst) {
     UA_NodeId_copy(&target->nodeId, &rrq->nodesToRead[i].nodeId);
   }
   rrs = UA_Client_read(client, rrq);
-  UA_ReadRequest_delete(rrq);
   if (rrs.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-    return rrs.responseHeader.serviceResult;
+    retval =  rrs.responseHeader.serviceResult;
   if (rrs.resultsSize != rrq->nodesToReadSize)
-    return rrs.responseHeader.serviceResult;
+    retval = rrs.responseHeader.serviceResult;
+  UA_ReadRequest_delete(rrq);
+  if (!(retval == UA_STATUSCODE_GOOD))
+    return retval;
   
   if (rrs.results[0].value.data != NULL)
     UA_Boolean_copy((UA_Boolean *) rrs.results[0].value.data, &target->isAbstract);
@@ -1503,11 +1500,13 @@ UA_Client_appendVariableNodeAttributes(UA_Client *client, void *dst) {
     UA_NodeId_copy(&target->nodeId, &rrq->nodesToRead[i].nodeId);
   }
   rrs = UA_Client_read(client, rrq);
-  UA_ReadRequest_delete(rrq);
   if (rrs.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-    return rrs.responseHeader.serviceResult;
+    retval =  rrs.responseHeader.serviceResult;
   if (rrs.resultsSize != rrq->nodesToReadSize)
-    return rrs.responseHeader.serviceResult;
+    retval = rrs.responseHeader.serviceResult;
+  UA_ReadRequest_delete(rrq);
+  if (!(retval == UA_STATUSCODE_GOOD))
+    return retval;
 
   if (rrs.results[0].value.data != NULL)
     UA_Variant_copy((UA_Variant *) &rrs.results[0].value, &target->value.variant);
@@ -1552,11 +1551,13 @@ UA_Client_appendVariableTypeNodeAttributes(UA_Client *client, void *dst) {
   rrq->nodesToRead[0].attributeId = UA_ATTRIBUTEID_ISABSTRACT;
   
   rrs = UA_Client_read(client, rrq);
-  UA_ReadRequest_delete(rrq);
   if (rrs.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-    return rrs.responseHeader.serviceResult;
+    retval =  rrs.responseHeader.serviceResult;
   if (rrs.resultsSize != rrq->nodesToReadSize)
-    return rrs.responseHeader.serviceResult;
+    retval = rrs.responseHeader.serviceResult;
+  UA_ReadRequest_delete(rrq);
+  if (!(retval == UA_STATUSCODE_GOOD))
+    return retval;
   
   if (rrs.results[0].value.data != NULL)
     UA_Boolean_copy((UA_Boolean *) rrs.results[0].value.data, &target->isAbstract);
@@ -1590,11 +1591,13 @@ UA_Client_appendReferenceTypeNodeAttributes(UA_Client *client, void *dst) {
     UA_NodeId_copy(&target->nodeId, &rrq->nodesToRead[i].nodeId);
   }
   rrs = UA_Client_read(client, rrq);
-  UA_ReadRequest_delete(rrq);
   if (rrs.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-    return rrs.responseHeader.serviceResult;
+    retval =  rrs.responseHeader.serviceResult;
   if (rrs.resultsSize != rrq->nodesToReadSize)
-    return rrs.responseHeader.serviceResult;
+    retval = rrs.responseHeader.serviceResult;
+  UA_ReadRequest_delete(rrq);
+  if (!(retval == UA_STATUSCODE_GOOD))
+    return retval;
   
   if (rrs.results[0].value.data != NULL)
     UA_Boolean_copy((UA_Boolean *) rrs.results[0].value.data, &target->isAbstract);
@@ -1605,7 +1608,6 @@ UA_Client_appendReferenceTypeNodeAttributes(UA_Client *client, void *dst) {
   
   UA_ReadResponse_deleteMembers(&rrs);
   return retval;
-  return retval;
 }
 
 UA_StatusCode 
@@ -1627,11 +1629,13 @@ UA_Client_appendViewNodeAttributes(UA_Client *client, void *dst) {
     UA_NodeId_copy(&target->nodeId, &rrq->nodesToRead[i].nodeId);
   }
   rrs = UA_Client_read(client, rrq);
-  UA_ReadRequest_delete(rrq);
   if (rrs.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-    return rrs.responseHeader.serviceResult;
+    retval =  rrs.responseHeader.serviceResult;
   if (rrs.resultsSize != rrq->nodesToReadSize)
-    return rrs.responseHeader.serviceResult;
+    retval = rrs.responseHeader.serviceResult;
+  UA_ReadRequest_delete(rrq);
+  if (!(retval == UA_STATUSCODE_GOOD))
+    return retval;
   
   if (rrs.results[0].value.data != NULL)
     UA_Boolean_copy((UA_Boolean *) rrs.results[0].value.data, &target->containsNoLoops);
@@ -1640,7 +1644,6 @@ UA_Client_appendViewNodeAttributes(UA_Client *client, void *dst) {
   
   UA_ReadResponse_deleteMembers(&rrs);
   return retval;
-  return retval;
 }
 
 UA_StatusCode 
@@ -1661,11 +1664,13 @@ UA_Client_appendDataTypeNodeAttributes(UA_Client *client, void *dst) {
     UA_NodeId_copy(&target->nodeId, &rrq->nodesToRead[i].nodeId);
   }
   rrs = UA_Client_read(client, rrq);
-  UA_ReadRequest_delete(rrq);
   if (rrs.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-    return rrs.responseHeader.serviceResult;
+    retval =  rrs.responseHeader.serviceResult;
   if (rrs.resultsSize != rrq->nodesToReadSize)
-    return rrs.responseHeader.serviceResult;
+    retval = rrs.responseHeader.serviceResult;
+  UA_ReadRequest_delete(rrq);
+  if (!(retval == UA_STATUSCODE_GOOD))
+    return retval;
   
   if (rrs.results[0].value.data != NULL)
     UA_Boolean_copy((UA_Boolean *) rrs.results[0].value.data, &target->isAbstract);
@@ -1693,11 +1698,13 @@ UA_StatusCode UA_Client_appendMethodNodeAttributes(UA_Client *client, void *dst)
   }
   
   rrs = UA_Client_read(client, rrq);
-  UA_ReadRequest_delete(rrq);
   if (rrs.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-    return rrs.responseHeader.serviceResult;
+    retval =  rrs.responseHeader.serviceResult;
   if (rrs.resultsSize != rrq->nodesToReadSize)
-    return rrs.responseHeader.serviceResult;
+    retval = rrs.responseHeader.serviceResult;
+  UA_ReadRequest_delete(rrq);
+  if (!(retval == UA_STATUSCODE_GOOD))
+    return retval;
   
   if (rrs.results[0].value.data != NULL)
     UA_Boolean_copy((UA_Boolean *) rrs.results[0].value.data, &target->executable);
@@ -1731,10 +1738,14 @@ UA_Client_getNodeCopy(UA_Client *client, UA_NodeId nodeId, void **copyInto) {
     UA_NodeId_copy(&nodeId, &rrq->nodesToRead[i].nodeId);
   }
   rrs = UA_Client_read(client, rrq);
-  if (rrs.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
+  if (rrs.responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
+    UA_ReadRequest_delete(rrq);
     return rrs.responseHeader.serviceResult;
-  if (rrs.resultsSize != rrq->nodesToReadSize)
+  }
+  if (rrs.resultsSize != rrq->nodesToReadSize) {
+    UA_ReadRequest_delete(rrq);
     return rrs.responseHeader.serviceResult;
+  }
   UA_ReadRequest_delete(rrq);
   
   UA_UInt32 *nodeClass = rrs.results[1].value.data;
@@ -1780,7 +1791,6 @@ UA_Client_getNodeCopy(UA_Client *client, UA_NodeId nodeId, void **copyInto) {
       retval |= UA_Client_appendDataTypeNodeAttributes(client, *copyInto);
       break;
     default:
-      UA_ReadRequest_delete(rrq);
       UA_ReadResponse_deleteMembers(&rrs);
       return UA_STATUSCODE_BADNODECLASSINVALID;
   }

+ 21 - 14
src/server/ua_server_addressspace.c

@@ -1241,7 +1241,7 @@ static void UA_Server_addInstanceOf_inheritParentAttributes(UA_Server *server, a
 {
   UA_Boolean refTypeValid;
   UA_ReferenceNode ref;
-  arrayOfNodeIds visitedNodes = (arrayOfNodeIds) {.size=0, .ids = NULL};
+  arrayOfNodeIds visitedNodes = (arrayOfNodeIds) {.size=0, .ids = UA_NULL};
   for(int i=0; i<typeDefNode->referencesSize; i++) {
     ref = typeDefNode->references[i];
     if (ref.isInverse == UA_FALSE)
@@ -1280,10 +1280,10 @@ static void UA_Server_addInstanceOf_instatiateChildObject(UA_Server *server,
   UA_Node *typeDefNode;
   UA_Server_getNodeCopy(server, typeDefinition.nodeId, (void *) &typeDefNode);
   
-  if (typeDefNode == NULL) {
+  if (typeDefNode == UA_NULL) {
     return;
   }
-  if (!typeDefNode->nodeClass == UA_NODECLASS_OBJECTTYPE) {
+  if (!(typeDefNode->nodeClass == UA_NODECLASS_OBJECTTYPE)) {
     UA_Server_deleteNodeCopy(server, (void **) &typeDefNode);
     return;
   }
@@ -1296,7 +1296,7 @@ static void UA_Server_addInstanceOf_instatiateChildObject(UA_Server *server,
   if (retval)
     return;
   
-  if (callback != NULL)
+  if (callback != UA_NULL)
     callback(objectRoot, typeDefinition.nodeId, handle);
   
   // (1) If this node is a subtype of any other node, create its things first
@@ -1335,16 +1335,18 @@ void UA_Server_addInstanceOf_instatiateChildNode(UA_Server *server,
       continue;
     
     // What type of node is this?
-    refClass = NULL;
+    refClass = UA_NULL;
     UA_Server_getAttributeValue(server, ref.targetId.nodeId, UA_ATTRIBUTEID_NODECLASS, (void **) &refClass);
     switch (*refClass) {
       case UA_NODECLASS_VARIABLE: // Just clone the variable node with a new nodeId
         UA_Server_getNodeCopy(server, ref.targetId.nodeId, (void **) &nodeClone);
+        if (nodeClone == UA_NULL)
+          break;
         UA_NodeId_init(&nodeClone->nodeId);
         nodeClone->nodeId.namespaceIndex = objectRoot.namespaceIndex;
-        if (nodeClone != NULL) {
+        if (nodeClone != UA_NULL) {
           adres = UA_Server_addNode(server, nodeClone,  *objectRootExpanded, ref.referenceTypeId);
-          if (callback != NULL)
+          if (callback != UA_NULL)
             callback(adres.addedNodeId, ref.targetId.nodeId, handle);
         }
         break;
@@ -1366,7 +1368,7 @@ void UA_Server_addInstanceOf_instatiateChildNode(UA_Server *server,
           UA_Variant_copy(&varTypeNode->value.variant, &newVarNode->value.variant);
         
         adres = UA_Server_addNode(server, (UA_Node *) newVarNode, *objectRootExpanded, ref.referenceTypeId);
-        if (callback != NULL)
+        if (callback != UA_NULL)
           callback(adres.addedNodeId, ref.targetId.nodeId, handle);
         UA_Server_deleteNodeCopy(server, (void **) &newVarNode);
         UA_Server_deleteNodeCopy(server, (void **) &varTypeNode);
@@ -1414,6 +1416,9 @@ void UA_Server_addInstanceOf_instatiateChildNode(UA_Server *server,
     }
     UA_NodeClass_delete(refClass);
   }
+  
+  if (objectRootExpanded != UA_NULL)
+    UA_ExpandedNodeId_delete(objectRootExpanded);
   return;
 }
 
@@ -1424,12 +1429,12 @@ UA_StatusCode UA_Server_appendInstanceOfSupertype(UA_Server *server, UA_NodeId n
 {
   UA_StatusCode retval = UA_STATUSCODE_GOOD;
 
-  UA_Node *typeDefNode;
+  UA_Node *typeDefNode = UA_NULL;
   UA_Server_getNodeCopy(server, nodeId, (void *) &typeDefNode);
-  if (typeDefNode == NULL) {
+  if (typeDefNode == UA_NULL) {
   return UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
   }
-  if (!typeDefNode->nodeClass == UA_NODECLASS_OBJECTTYPE) {
+  if (!(typeDefNode->nodeClass == UA_NODECLASS_OBJECTTYPE)) {
   UA_Server_deleteNodeCopy(server, (void **) &typeDefNode);
   return UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
   }
@@ -1443,6 +1448,8 @@ UA_StatusCode UA_Server_appendInstanceOfSupertype(UA_Server *server, UA_NodeId n
   UA_Server_addInstanceOf_instatiateChildNode(server, subtypeRefs, componentRefs, UA_NULL, 
                                               appendToNodeId, callback, (UA_ObjectTypeNode *) typeDefNode, 
                                               UA_FALSE, instantiatedTypes, handle);
+  if (objectRootExpanded != UA_NULL)
+    UA_ExpandedNodeId_delete(objectRootExpanded);
   return retval;
 }
 
@@ -1454,13 +1461,13 @@ UA_StatusCode UA_Server_addInstanceOf(UA_Server *server, UA_NodeId nodeId, const
 {
   UA_StatusCode retval = UA_STATUSCODE_GOOD;
   
-  UA_Node *typeDefNode;
+  UA_Node *typeDefNode = UA_NULL;
   UA_Server_getNodeCopy(server, typeDefinition.nodeId, (void *) &typeDefNode);
   
-  if (typeDefNode == NULL) {
+  if (typeDefNode == UA_NULL) {
     return UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
   }
-  if (!typeDefNode->nodeClass == UA_NODECLASS_OBJECTTYPE) {
+  if (!(typeDefNode->nodeClass == UA_NODECLASS_OBJECTTYPE)) {
     UA_Server_deleteNodeCopy(server, (void **) &typeDefNode);
     return UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
   }