Przeglądaj źródła

Fixed memory leak introduced by reusing browseResponse during instantiation.

ichrispa 8 lat temu
rodzic
commit
a988d1c932

+ 17 - 17
examples/server_instantiation.c

@@ -43,35 +43,35 @@ int main(void) {
     
     otAttr.description = UA_LOCALIZEDTEXT("en_US", "A mamal");
     otAttr.displayName = UA_LOCALIZEDTEXT("en_US", "MamalType");
-    retval = UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 10000), 
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                         UA_QUALIFIEDNAME(1, "MamalType"), otAttr, NULL, NULL);
-    
+    UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 10000), 
+                                UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
+                                UA_QUALIFIEDNAME(1, "MamalType"), otAttr, NULL, NULL);
+  
     UA_VariableAttributes   vAttr;
     UA_VariableAttributes_init(&vAttr);
     vAttr.description =  UA_LOCALIZEDTEXT("en_US", "This mamals Age in months");
     vAttr.displayName =  UA_LOCALIZEDTEXT("en_US", "Age");
     UA_UInt32 ageVar = 0;
     UA_Variant_setScalarCopy(&vAttr.value, &ageVar, &UA_TYPES[UA_TYPES_UINT32]);
-    retval = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 10001), 
-                                       UA_NODEID_NUMERIC(1, 10000), UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                                       UA_QUALIFIEDNAME(1, "Age"), UA_NODEID_NULL, vAttr, NULL, NULL);
-    
+    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 10001), 
+                              UA_NODEID_NUMERIC(1, 10000), UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
+                              UA_QUALIFIEDNAME(1, "Age"), UA_NODEID_NULL, vAttr, NULL, NULL);
+  
     UA_ObjectTypeAttributes_init(&otAttr);
     otAttr.description = UA_LOCALIZEDTEXT("en_US", "A dog, subtype of mamal");
     otAttr.displayName = UA_LOCALIZEDTEXT("en_US", "DogType");
-    retval = UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 10002), 
-                                         UA_NODEID_NUMERIC(1, 10000), UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                         UA_QUALIFIEDNAME(1, "DogType"), otAttr, NULL, NULL);
+    UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 10002), 
+                                UA_NODEID_NUMERIC(1, 10000), UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
+                                UA_QUALIFIEDNAME(1, "DogType"), otAttr, NULL, NULL);
     
     UA_VariableAttributes_init(&vAttr);
     vAttr.description =  UA_LOCALIZEDTEXT("en_US", "This mamals Age in months");
     vAttr.displayName =  UA_LOCALIZEDTEXT("en_US", "Name");
     UA_String defaultName = UA_STRING("unnamed dog");
     UA_Variant_setScalarCopy(&vAttr.value, &defaultName, &UA_TYPES[UA_TYPES_STRING]);
-    retval = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 10003), 
-                                       UA_NODEID_NUMERIC(1, 10002), UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                                       UA_QUALIFIEDNAME(1, "Name"), UA_NODEID_NULL, vAttr, NULL, NULL);
+    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 10003), 
+                              UA_NODEID_NUMERIC(1, 10002), UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
+                              UA_QUALIFIEDNAME(1, "Name"), UA_NODEID_NULL, vAttr, NULL, NULL);
     
     /* Instatiate a dog named bello:
      * (O) Objects
@@ -84,9 +84,9 @@ int main(void) {
     UA_ObjectAttributes_init(&oAttr);
     oAttr.description = UA_LOCALIZEDTEXT("en_US", "A dog named Bello");
     oAttr.displayName = UA_LOCALIZEDTEXT("en_US", "Bello");
-    retval = UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 0), 
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                       UA_QUALIFIEDNAME(1, "Bello"), UA_NODEID_NUMERIC(1, 10002), oAttr, NULL, NULL);
+    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 0), 
+                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
+                            UA_QUALIFIEDNAME(1, "Bello"), UA_NODEID_NUMERIC(1, 10002), oAttr, NULL, NULL);
     
     retval = UA_Server_run(server, &running);
     UA_Server_delete(server);

+ 4 - 1
src/server/ua_services_nodemanagement.c

@@ -462,12 +462,14 @@ instantiateObjectNode(UA_Server *server, UA_Session *session,
     }
     
     // Instantiate supertype attributes if a supertype is available
+    UA_BrowseResult_deleteMembers(&browseResult);
+    UA_BrowseResult_init(&browseResult);
+    browseChildren.nodeId = *typeId;
     browseChildren.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE);
     browseChildren.includeSubtypes = false;
     browseChildren.browseDirection = UA_BROWSEDIRECTION_INVERSE; // isSubtypeOf
     browseChildren.nodeClassMask = UA_NODECLASS_OBJECTTYPE;
     browseChildren.resultMask = UA_BROWSERESULTMASK_REFERENCETYPEID | UA_BROWSERESULTMASK_NODECLASS;
-    UA_BrowseResult_init(&browseResult);
     // todo: continuation points if there are too many results
     Service_Browse_single(server, session, NULL, &browseChildren, 100, &browseResult);
     
@@ -478,6 +480,7 @@ instantiateObjectNode(UA_Server *server, UA_Session *session,
       instantiateObjectNode(server, session, nodeId, &rd->nodeId.nodeId, instantiationCallback);
     }
     
+    UA_BrowseResult_deleteMembers(&browseResult);
     
     /* add a hastypedefinition reference */
     UA_AddReferencesItem addref;