Fix memory leak
authorsaerome.kim <saerome.kim@samsung.com>
Tue, 3 Dec 2019 12:29:45 +0000 (21:29 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Thu, 5 Dec 2019 10:27:05 +0000 (19:27 +0900)
- Problem: Even clients app. died, ua-manager keeps dead client's
  monitor handle.
- Cause: ua-manager does not care for the dead client app.
- Solution: Remove the client's monitor handle if the client requests un-initialization.

Change-Id: I992bf5a6234675fbc3b81fad7f97b530e4019ae4
Signed-off-by: saerome.kim <saerome.kim@samsung.com>
ua-daemon/src/ua-manager-core.c
ua-daemon/src/ua-manager-request-handler.c

index 1bed38f..da0a258 100644 (file)
@@ -3172,8 +3172,11 @@ void _uam_core_cleanup_monitor(char *name)
                if (0 != g_strcmp0(name, monitor->name))
                        continue;
 
+               /* If there is a monitor that is not freed, stop detection
+                * and free the monitor structure in the memory. */
+               UAM_INFO("clear %s's monitor info.", monitor->name);
                __uam_core_stop_detection(monitor->mode,
-                               monitor->service->name, name, monitor->sensors);
+                       monitor->service->name, name, monitor->sensors);
        }
 }
 
index 23291df..7aec3a1 100644 (file)
@@ -27,6 +27,7 @@ static GSList *request_list = NULL;
 static GDBusConnection *uam_manager_conn;
 static guint g_dbus_object_id = 0;
 static guint owner_id = 0;
+static guint owner_sig_id = 0;
 
 static const gchar uam_manager_introspection_xml[] =
 "<node name='/net/uamd'>"
@@ -910,16 +911,16 @@ static void __uam_manager_method(
        FUNC_ENTRY;
        int result = UAM_ERROR_NONE;
 
-       UAM_DBG("Method[%s] Path[%s] Interface[%s]",
-                       method_name, object_path, interface_name);
+       UAM_DBG("Sender[%s] Method[%s] Path[%s] Interface[%s]",
+                       sender, method_name, object_path, interface_name);
 
        if (0 == g_strcmp0(method_name, "enable")) {
                int enable = FALSE;
 
                g_variant_get(parameters, "(i)", &enable);
-               UAM_INFO("Enable ua-manager %s", enable == TRUE ? "enabled" : "disabled");
-               g_dbus_method_invocation_return_value(invocation,
-                       g_variant_new("(i)", result));
+               UAM_INFO("ua-manager %s", enable == TRUE ? "enabled" : "disabled");
+
+               g_dbus_method_invocation_return_value(invocation, g_variant_new("(i)", result));
 
        } else if (0 == g_strcmp0(method_name, "uam_request")) {
                int function;
@@ -1051,6 +1052,26 @@ static void __uam_manager_name_lost_cb(
        /*TODO: Terminate daemon */
 }
 
+static void __uam_manager_owner_change_cb(GDBusConnection *connection,
+               const gchar *sender_name,
+               const gchar *object_path,
+               const gchar *interface_name,
+               const gchar *signal_name,
+               GVariant *parameters,
+               gpointer user_data)
+{
+       const char *name = NULL;
+       const char *old_owner = NULL;
+       const char *new_owner = NULL;
+
+       g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
+
+       if ('\0' == *new_owner) {
+               /* Clean up client info */
+               _uam_core_cleanup_monitor((char *)name);
+       }
+}
+
 static void __uam_manager_bus_acquired_cb(
                GDBusConnection *connection, const gchar *name, gpointer user_data)
 {
@@ -1071,6 +1092,14 @@ static void __uam_manager_bus_acquired_cb(
        __uam_manager_register_object(connection, node_info);
        g_dbus_node_info_unref(node_info);
 
+       /* Subscribe for name lost signal */
+       owner_sig_id = g_dbus_connection_signal_subscribe(connection,
+                       UAM_SERVICE_DBUS, UAM_INTERFACE_DBUS,
+                       NAME_OWNER_CHANGED, NULL, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
+                       __uam_manager_owner_change_cb, NULL, NULL);
+
+       UAM_DBG("owner_sig_id: [%d]", owner_sig_id);
+
        uam_manager_conn = connection;
 
        FUNC_EXIT;
@@ -1100,17 +1129,10 @@ void _uam_manager_unregister(void)
        FUNC_ENTRY;
 
        if (uam_manager_conn) {
-
+               g_dbus_connection_signal_unsubscribe(uam_manager_conn, owner_sig_id);
                __uam_manager_unregister_object(uam_manager_conn);
-
                g_object_unref(uam_manager_conn);
-               uam_manager_conn = NULL;
-
-               if (owner_id > 0) {
-                       g_bus_unown_name(owner_id);
-                       owner_id = 0;
-               }
-
+               g_bus_unown_name(owner_id);
        }
 
        FUNC_EXIT;