SDOCM00115434 NameServer_delete in LAD daemon leaks memory
authorRamsey Harris <ramsey@ti.com>
Wed, 25 Mar 2015 23:22:47 +0000 (16:22 -0700)
committerRobert Tivy <rtivy@ti.com>
Thu, 26 Mar 2015 23:41:20 +0000 (16:41 -0700)
Remove invalid assertion that name list must be empty. This
is not true and instance might still be in use by another
client (object is reference counted). Add while loop to delete
each entry on the name list. Destroy the object's gate (was not
being done). Remove macro to destruct a list object (not needed).

linux/src/daemon/NameServer_daemon.c

index 9bc1fad66df31ccdbd2a473324a9062f0c4cd00d..8c30aa60ba0226682ddb7463a62e9ed5f0e95415 100644 (file)
@@ -143,11 +143,6 @@ typedef struct NameServer_ModuleObject {
     pthread_mutex_t      modGate;
 } NameServer_ModuleObject;
 
     pthread_mutex_t      modGate;
 } NameServer_ModuleObject;
 
-#define CIRCLEQ_destruct(head) { \
-        (head)->cqh_first = NULL; \
-        (head)->cqh_last = NULL; \
-}
-
 #define CIRCLEQ_elemClear(elem) { \
         (elem)->cqe_next = (elem)->cqe_prev = (Void *)(elem); \
 }
 #define CIRCLEQ_elemClear(elem) { \
         (elem)->cqe_next = (elem)->cqe_prev = (Void *)(elem); \
 }
@@ -514,7 +509,7 @@ Int NameServer_destroy(void)
         goto exit;
     }
 
         goto exit;
     }
 
-    CIRCLEQ_destruct(&NameServer_module->objList);
+    /* TODO: delete any remaining instances */
 
     /* shutdown the NameServer listener thread */
     LOG0("NameServer_destroy: shutdown listener...\n")
 
     /* shutdown the NameServer listener thread */
     LOG0("NameServer_destroy: shutdown listener...\n")
@@ -647,37 +642,47 @@ leave:
     return (handle);
 }
 
     return (handle);
 }
 
-
-/* Function to delete a name server. */
-Int NameServer_delete(NameServer_Handle * handle)
+/*
+ *  ======== NameServer_delete ========
+ *  Delete a name server instance
+ */
+Int NameServer_delete(NameServer_Handle *handle)
 {
     Int status = NameServer_S_SUCCESS;
 {
     Int status = NameServer_S_SUCCESS;
+    struct NameServer_Object *obj;
 
     assert(handle != NULL);
     assert(*handle != NULL);
 
     assert(handle != NULL);
     assert(*handle != NULL);
-    assert((*handle)->count == 0);
     assert(NameServer_module->refCount != 0);
 
     assert(NameServer_module->refCount != 0);
 
+    obj = *(struct NameServer_Object **)handle;
+
     pthread_mutex_lock(&NameServer_module->modGate);
 
     pthread_mutex_lock(&NameServer_module->modGate);
 
-    (*handle)->refCount--;
-    if ((*handle)->refCount != 0) {
+    obj->refCount--;
+    if (obj->refCount != 0) {
         goto leave;
     }
 
         goto leave;
     }
 
-    if ((*handle)->count == 0) {
-        CIRCLEQ_REMOVE(&NameServer_module->objList, *handle, elem);
+    /* delete each entry on the name list */
+    while (obj->nameList.cqh_first != (void *)&obj->nameList) {
+        NameServer_removeEntry(*handle, (Ptr)(obj->nameList.cqh_first));
+    }
 
 
-        if ((*handle)->name != NULL) {
-            free((*handle)->name);
-            (*handle)->name = NULL;
-        }
+    /* free the instance name */
+    if (obj->name != NULL) {
+        free(obj->name);
+        obj->name = NULL;
+    }
 
 
-        CIRCLEQ_destruct(&(*handle)->nameList);
+    /* destroy the mutex */
+    pthread_mutex_destroy(&obj->gate);
 
 
-        free((*handle));
-        (*handle) = NULL;
-    }
+    /* finally, free the instance object */
+    free(obj);
+
+    /* set the caller's handle to null */
+    (*handle) = NULL;
 
 leave:
     pthread_mutex_unlock(&NameServer_module->modGate);
 
 leave:
     pthread_mutex_unlock(&NameServer_module->modGate);