fix resource leaks 14/261314/2
authorJeonghoon Park <jh1979.park@samsung.com>
Thu, 15 Jul 2021 06:18:30 +0000 (15:18 +0900)
committerJeonghoon Park <jh1979.park@samsung.com>
Fri, 16 Jul 2021 05:21:54 +0000 (14:21 +0900)
Because e_dbus_bus_get() creates a new private connection everytime it called (unlike dbus_bus_get()),
the application should handle every connections created by e_dbus_bus_get() if it called several times

Change-Id: Ia4fb997c0d966e5cc47eb9b41c4de9efeeb1e106

include/dbus_util.h
src/common/popup.c
src/common/starter.c
src/dbus_util.c

index d3ebf12..3e699a9 100644 (file)
@@ -59,5 +59,6 @@ extern void dbus_util_send_sys_lock_teminate_signal(void);
 extern int dbus_util_receive_lcd_status(void (*changed_cb)(void *data, DBusMessage *msg), void *data);
 extern int dbus_util_receive_sys_lock_status(void (*changed_cb)(void *data, DBusMessage *msg), void *data);
 extern char *dbus_util_msg_arg_get_str(DBusMessage *msg);
+extern void dbus_util_resource_cleanup(void);
 
 #endif //__DBUS_UTIL_H__
index f86f384..4291b02 100644 (file)
 
 static void _popup_destroy(Evas_Object *popup)
 {
-       Evas_Object *win = NULL;
-
        if (popup) {
+               Evas_Object *win = NULL;
                win = evas_object_data_del(popup, POPUP_DATA_KEY_WINDOW);
-               evas_object_del(popup);
-
-               if (win) {
+               if (win)
                        evas_object_del(win);
-               }
+
+               evas_object_del(popup);
        }
 }
 
@@ -92,7 +90,11 @@ Evas_Object *popup_create(const char *title, const char *text)
        goto_if(!win, ERROR);
 
        popup = elm_popup_add(win);
-       goto_if(!popup, ERROR);
+       if (!popup) {
+               _E("Failed to create popup");
+               evas_object_del(win);
+               return NULL;
+       }
 
        elm_popup_orient_set(popup, ELM_POPUP_ORIENT_BOTTOM);
        evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
index 5f03306..174acf1 100755 (executable)
@@ -37,6 +37,7 @@
 #include "status.h"
 #include "hw_key.h"
 #include "oobe_mgr.h"
+#include "dbus_util.h"
 
 #define LOCKSCREEN_ENABLE 0
 
@@ -339,6 +340,7 @@ static void _fini(void)
        }
 
        e_dbus_shutdown();
+       dbus_util_resource_cleanup();
 }
 
 
index e8ceb72..9d334d2 100755 (executable)
 #define POWEROFF_INTERFACE_NAME POWEROFF_BUS_NAME".Powerkey"
 #define METHOD_POWEROFF_NAME   "PopupLaunch"
 
+static E_DBus_Connection *g_e_conn;
+
+static E_DBus_Connection *_get_e_dbus_connection(void)
+{
+       if (!g_e_conn)
+               g_e_conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
+
+       return g_e_conn;
+}
+
 static int _append_variant(DBusMessageIter *iter, const char *sig, char *param[])
 {
        char *ch;
@@ -84,6 +94,7 @@ static int _invoke_dbus_method_sync(const char *dest, const char *path,
        msg = dbus_message_new_method_call(dest, path, interface, method);
        if (!msg) {
                _E("Failed to dbus_message_new_method_call(%s:%s-%s).", path, interface, method);
+               dbus_connection_unref(conn);
                return -EBADMSG;
        }
 
@@ -106,6 +117,7 @@ static int _invoke_dbus_method_sync(const char *dest, const char *path,
        dbus_message_unref(msg);
        if (!reply) {
                _E("Failed to dbus_connection_send. dest=%s %s:%s-%s. err.name=%s: %s", dest, path, interface, method, err.name, err.message);
+               dbus_connection_unref(conn);
                dbus_error_free(&err);
                return -ECOMM;
        }
@@ -114,16 +126,18 @@ static int _invoke_dbus_method_sync(const char *dest, const char *path,
        dbus_message_unref(reply);
        if (!ret) {
                _E("No message dest=%s %s:%s-%s. err.name=%s: %s", dest, path, interface, method, err.name, err.message);
+               dbus_connection_unref(conn);
                dbus_error_free(&err);
                return -ENOMSG;
        }
 
+       dbus_connection_unref(conn);
        return result;
 }
 
 
 
-void dbus_util_broadcast_signal(const char *path, const char *interface, const char *name, const char *type, char *signal[])
+static void dbus_util_broadcast_signal(const char *path, const char *interface, const char *name, const char *type, char *signal[])
 {
        DBusMessage *msg;
        DBusMessageIter iter;
@@ -140,22 +154,25 @@ void dbus_util_broadcast_signal(const char *path, const char *interface, const c
        r = _append_variant(&iter, type, signal);
        if (r < 0) {
                _E("Failed to append variant[%d]", r);
+               dbus_message_unref(msg);
                return;
        }
 
        conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
        if (conn == NULL) {
                _E("Failed to get bus");
+               dbus_message_unref(msg);
                return;
        }
 
        r = dbus_connection_send(conn, msg, NULL);
-       if (!r) {
+       if (!r)
                _E("Failed to send message[%s][%s][%s]", path, interface, name);
-               return;
-       }
-       _D("dbus_util_broadcast_signal success");
+       else
+               _D("dbus_util_broadcast_signal success");
+
        dbus_message_unref(msg);
+       dbus_connection_unref(conn);
 }
 
 
@@ -197,27 +214,35 @@ void dbus_util_send_poweroff_signal(void)
 
 void dbus_util_send_sys_lock_teminate_signal(void)
 {
-       E_DBus_Connection *conn;
+       DBusConnection *conn = NULL;
        DBusMessage *msg;
        int ret = 1;
 
-       conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
+
+       conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
        if (conn == NULL) {
-               _E("e_dbus_bus_get error");
+               _E("Failed to get bus");
+               return;
        }
 
        msg = dbus_message_new_signal(SYS_LOCK_OBJECT_PATH,
                        SYS_LOCK_INTERFACE_TERMINATE,
                        SYS_LOCK_MEMBER_TERMINATE);
+       if (msg == NULL) {
+               _E("Failed to dbus_message_new_signal");
+               dbus_connection_unref(conn);
+               return;
+       }
 
        if (!dbus_message_append_args(msg, DBUS_TYPE_INT32, &ret, DBUS_TYPE_INVALID)) {
                _E("dbus_message_append_args error");
        }
 
-       e_dbus_message_send(conn, msg, NULL, -1, NULL);
+       dbus_connection_send(conn, msg, NULL);
        dbus_message_unref(msg);
 
        _D("%s-%s", SYS_LOCK_INTERFACE_TERMINATE, SYS_LOCK_MEMBER_TERMINATE);
+       dbus_connection_unref(conn);
 }
 
 
@@ -227,10 +252,10 @@ int dbus_util_receive_lcd_status(void (*changed_cb)(void *data, DBusMessage *msg
        E_DBus_Connection *conn;
        E_DBus_Signal_Handler *handler;
 
-       conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
+       conn = _get_e_dbus_connection();
        if (conn == NULL) {
-               _E("e_dbus_bus_get error");
-               return 0;
+               _E("_get_e_dbus_connection error");
+               return -1;
        }
 
        handler = e_dbus_signal_handler_add(conn, NULL, DISPLAY_OBJECT_PATH,
@@ -238,7 +263,7 @@ int dbus_util_receive_lcd_status(void (*changed_cb)(void *data, DBusMessage *msg
                                                                changed_cb, data);
        if (handler == NULL) {
                _E("e_dbus_signal_handler_add error");
-               return 0;
+               return -1;
        }
 
        handler = e_dbus_signal_handler_add(conn, NULL, DISPLAY_OBJECT_PATH,
@@ -246,10 +271,10 @@ int dbus_util_receive_lcd_status(void (*changed_cb)(void *data, DBusMessage *msg
                                                                changed_cb, data);
        if (handler == NULL) {
                _E("e_dbus_signal_handler_add error");
-               return 0;
+               return -1;
        }
 
-       return 1;
+       return 0;
 }
 
 
@@ -259,9 +284,9 @@ int dbus_util_receive_sys_lock_status(void (*changed_cb)(void *data, DBusMessage
        E_DBus_Connection *conn;
        E_DBus_Signal_Handler *handler;
 
-       conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
+       conn = _get_e_dbus_connection();
        if (conn == NULL) {
-               _E("e_dbus_bus_get error");
+               _E("_get_e_dbus_connection error");
                return -1;
        }
 
@@ -296,3 +321,11 @@ ERROR:
 
        return NULL;
 }
+
+void dbus_util_resource_cleanup(void)
+{
+       if (g_e_conn) {
+               e_dbus_connection_close(g_e_conn);
+               g_e_conn = NULL;
+       }
+}