raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=acee84c8eb31777bda51a93f01cae53abe81572a

commit acee84c8eb31777bda51a93f01cae53abe81572a
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Tue Oct 8 14:54:52 2019 +0100

    bz5 - ensure we unref bluez dbus objects to free them
---
 src/modules/bluez5/bz.h       |  1 +
 src/modules/bluez5/bz_agent.c | 12 ++++++---
 src/modules/bluez5/bz_obj.c   | 58 +++++++++++++++++++++++++------------------
 3 files changed, 43 insertions(+), 28 deletions(-)

diff --git a/src/modules/bluez5/bz.h b/src/modules/bluez5/bz.h
index 2d099977f..63ebe00de 100644
--- a/src/modules/bluez5/bz.h
+++ b/src/modules/bluez5/bz.h
@@ -13,6 +13,7 @@ typedef struct _Obj Obj;
 
 struct _Obj {
    //// internal object data
+   Eldbus_Object *obj;
    Eldbus_Proxy *proxy;
    Eldbus_Proxy *prop_proxy;
    Eldbus_Signal_Handler *prop_sig;
diff --git a/src/modules/bluez5/bz_agent.c b/src/modules/bluez5/bz_agent.c
index 8eb0489cb..066b7a082 100644
--- a/src/modules/bluez5/bz_agent.c
+++ b/src/modules/bluez5/bz_agent.c
@@ -2,6 +2,7 @@
 #include "e.h"
 
 static Eldbus_Service_Interface *agent_iface = NULL;
+static Eldbus_Object *agent_obj = NULL;
 static Eldbus_Proxy *agent_proxy = NULL;
 static void (*fn_release) (void) = NULL;
 static void (*fn_cancel) (void) = NULL;
@@ -149,6 +150,11 @@ cb_unregister(void *data EINA_UNUSED, const Eldbus_Message 
*msg,
         eldbus_proxy_unref(agent_proxy);
         agent_proxy = NULL;
      }
+   if (agent_obj)
+     {
+        eldbus_object_unref(agent_obj);
+        agent_obj = NULL;
+     }
    if (agent_iface)
      {
         eldbus_service_object_unregister(agent_iface);
@@ -266,10 +272,8 @@ bz_agent_msg_u32_add(Eldbus_Message *msg, unsigned int u32)
 void
 bz_agent_init(void)
 {
-   Eldbus_Object *obj;
-
-   obj = eldbus_object_get(bz_conn, "org.bluez", "/org/bluez");
-   agent_proxy = eldbus_proxy_get(obj, "org.bluez.AgentManager1");
+   agent_obj = eldbus_object_get(bz_conn, "org.bluez", "/org/bluez");
+   agent_proxy = eldbus_proxy_get(agent_obj, "org.bluez.AgentManager1");
    agent_iface = eldbus_service_interface_register
      (bz_conn, "/org/enlightenment/bluez5/agent", &agent_desc);
    if (agent_proxy)
diff --git a/src/modules/bluez5/bz_obj.c b/src/modules/bluez5/bz_obj.c
index 8bcf66625..b61dc698f 100644
--- a/src/modules/bluez5/bz_obj.c
+++ b/src/modules/bluez5/bz_obj.c
@@ -1,6 +1,7 @@
 #include "bz.h"
 #include "e_mod_main.h"
 
+static Eldbus_Object *objman_obj = NULL;
 static Eldbus_Proxy *objman_proxy = NULL;
 static Eldbus_Signal_Handler *sig_ifadd = NULL;
 static Eldbus_Signal_Handler *sig_ifdel = NULL;
@@ -295,18 +296,16 @@ cb_obj_prop_changed(void *data EINA_UNUSED, const 
Eldbus_Message *msg EINA_UNUSE
 Obj *
 bz_obj_add(const char *path)
 {
-   Eldbus_Object *obj;
-
    Obj *o = calloc(1, sizeof(Obj));
    o->ref = 1;
    o->path = eina_stringshare_add(path);
-   obj = eldbus_object_get(bz_conn, "org.bluez", o->path);
+   o->obj = eldbus_object_get(bz_conn, "org.bluez", o->path);
    o->type = BZ_OBJ_UNKNOWN;
    o->in_table = EINA_TRUE;
    eina_hash_add(obj_table, o->path, o);
    if (!strcmp(o->path, "/org/bluez"))
      {
-        o->proxy = eldbus_proxy_get(obj, "org.bluez.AgentManager1");
+        o->proxy = eldbus_proxy_get(o->obj, "org.bluez.AgentManager1");
         o->type = BZ_OBJ_BLUEZ;
         o->add_called = EINA_TRUE;
         bz_obj_ref(o);
@@ -317,12 +316,12 @@ bz_obj_add(const char *path)
    // all devices are /org/bluez/XXX/dev_XXX so look for /dev_
    else if (strstr(o->path, "/dev_"))
      {
-        o->proxy = eldbus_proxy_get(obj, "org.bluez.Device1");
+        o->proxy = eldbus_proxy_get(o->obj, "org.bluez.Device1");
         o->type = BZ_OBJ_DEVICE;
         if (o->proxy)
           {
              eldbus_proxy_property_get_all(o->proxy, cb_obj_prop, o);
-             o->prop_proxy = eldbus_proxy_get(obj,
+             o->prop_proxy = eldbus_proxy_get(o->obj,
                                               
"org.freedesktop.DBus.Properties");
              if (o->prop_proxy)
                o->prop_sig = eldbus_proxy_signal_handler_add(o->prop_proxy,
@@ -334,12 +333,12 @@ bz_obj_add(const char *path)
    // all dadapters begin with /org/bluez/
    else if (!strncmp(o->path, "/org/bluez/", 11))
      {
-        o->proxy = eldbus_proxy_get(obj, "org.bluez.Adapter1");
+        o->proxy = eldbus_proxy_get(o->obj, "org.bluez.Adapter1");
         o->type = BZ_OBJ_ADAPTER;
         if (o->proxy)
           {
              eldbus_proxy_property_get_all(o->proxy, cb_obj_prop, o);
-             o->prop_proxy = eldbus_proxy_get(obj,
+             o->prop_proxy = eldbus_proxy_get(o->obj,
                                               
"org.freedesktop.DBus.Properties");
              if (o->prop_proxy)
                o->prop_sig = eldbus_proxy_signal_handler_add(o->prop_proxy,
@@ -742,16 +741,6 @@ bz_obj_unref(Obj *o)
         eldbus_signal_handler_del(o->prop_sig);
         o->prop_sig = NULL;
      }
-   if (o->proxy)
-     {
-        eldbus_proxy_unref(o->proxy);
-        o->proxy = NULL;
-     }
-   if (o->prop_proxy)
-     {
-        eldbus_proxy_unref(o->prop_proxy);
-        o->prop_proxy = NULL;
-     }
    if (o->path)
      {
         eina_stringshare_del(o->path);
@@ -787,6 +776,21 @@ bz_obj_unref(Obj *o)
         ecore_exe_free(o->ping_exe);
         o->ping_exe = NULL;
      }
+   if (o->proxy)
+     {
+        eldbus_proxy_unref(o->proxy);
+        o->proxy = NULL;
+     }
+   if (o->prop_proxy)
+     {
+        eldbus_proxy_unref(o->prop_proxy);
+        o->prop_proxy = NULL;
+     }
+   if (o->obj)
+     {
+        eldbus_object_unref(o->obj);
+        o->obj = NULL;
+     }
    free(o);
 }
 
@@ -894,12 +898,10 @@ _obj_hash_free(Obj *o)
 void
 bz_obj_init(void)
 {
-   Eldbus_Object *obj;
-
    obj_table = eina_hash_string_superfast_new((void *)_obj_hash_free);
 
-   obj = eldbus_object_get(bz_conn, "org.bluez", "/");
-   objman_proxy = eldbus_proxy_get(obj, "org.freedesktop.DBus.ObjectManager");
+   objman_obj = eldbus_object_get(bz_conn, "org.bluez", "/");
+   objman_proxy = eldbus_proxy_get(objman_obj, 
"org.freedesktop.DBus.ObjectManager");
    sig_ifadd = eldbus_proxy_signal_handler_add(objman_proxy, "InterfacesAdded",
                                                cb_obj_add, NULL);
    sig_ifdel = eldbus_proxy_signal_handler_add(objman_proxy, 
"InterfacesRemoved",
@@ -928,8 +930,16 @@ bz_obj_shutdown(void)
         eldbus_signal_handler_del(sig_ifdel);
         sig_ifdel = NULL;
      }
-   eldbus_proxy_unref(objman_proxy);
-   objman_proxy = NULL;
+   if (objman_proxy)
+     {
+        eldbus_proxy_unref(objman_proxy);
+        objman_proxy = NULL;
+     }
+   if (objman_obj)
+     {
+        eldbus_object_unref(objman_obj);
+        objman_obj = NULL;
+     }
 }
 
 void

-- 


Reply via email to