raster pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=44af3cb718a4354ef5e42b510daf29b5f6b3c282

commit 44af3cb718a4354ef5e42b510daf29b5f6b3c282
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Wed Oct 7 15:47:04 2015 +0900

    ethumb - fix client free issue with pending dbus messages
    
    this fixes T2769
    
    @fix
---
 src/lib/ethumb_client/ethumb_client.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/src/lib/ethumb_client/ethumb_client.c 
b/src/lib/ethumb_client/ethumb_client.c
index d20d893..2bae0dc 100644
--- a/src/lib/ethumb_client/ethumb_client.c
+++ b/src/lib/ethumb_client/ethumb_client.c
@@ -110,6 +110,7 @@ struct _Ethumb_Client
    Eina_List             *pending_add;
    Eina_List             *pending_remove;
    Eina_List             *pending_gen;
+   Eina_List             *dbus_pending;
    struct
    {
       Ethumb_Client_Die_Cb cb;
@@ -199,8 +200,11 @@ _ethumb_client_free(Ethumb_Client *client)
 {
    void *data;
    Eldbus_Object *obj;
+   Eldbus_Pending *pending;
 
    if (client->invalid) return;
+   EINA_LIST_FREE(client->dbus_pending, pending)
+     eldbus_pending_cancel(pending);
    client->invalid = EINA_TRUE;
    EINA_LIST_FREE(client->pending_add, data)
      {
@@ -363,13 +367,14 @@ _ethumb_client_report_connect(Ethumb_Client *client, 
Eina_Bool success)
 }
 
 static void
-_ethumb_client_new_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending 
*pending EINA_UNUSED)
+_ethumb_client_new_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending 
*pending)
 {
    const char *errname, *errmsg;
    const char *opath;
    Ethumb_Client *client = data;
    Eldbus_Object *obj;
 
+   client->dbus_pending = eina_list_remove(client->dbus_pending, pending);
    if (eldbus_message_error_get(msg, &errname, &errmsg))
      {
         ERR("Error: %s %s", errname, errmsg);
@@ -404,10 +409,14 @@ static void
 _ethumb_client_call_new(Ethumb_Client *client)
 {
    Eldbus_Message *msg;
+   Eldbus_Pending *pending;
    msg = eldbus_message_method_call_new(_ethumb_dbus_bus_name,
                                        _ethumb_dbus_path,
                                        _ethumb_dbus_interface, "new");
-   eldbus_connection_send(client->conn, msg, _ethumb_client_new_cb, client, 
-1);
+   pending = eldbus_connection_send(client->conn, msg,
+                                    _ethumb_client_new_cb, client, -1);
+   if (pending)
+     client->dbus_pending = eina_list_append(client->dbus_pending, pending);
 }
 
 static void
@@ -676,10 +685,13 @@ ethumb_client_on_server_die_callback_set(Ethumb_Client 
*client, Ethumb_Client_Di
  */
 
 static void
-_ethumb_client_ethumb_setup_cb(void *data EINA_UNUSED, const Eldbus_Message 
*msg, Eldbus_Pending *pending EINA_UNUSED)
+_ethumb_client_ethumb_setup_cb(void *data, const Eldbus_Message *msg, 
Eldbus_Pending *pending)
 {
    const char *errname, *errmsg;
    Eina_Bool result = 0;
+   Ethumb_Client *client = data;
+
+   client->dbus_pending = eina_list_remove(client->dbus_pending, pending);
 
    if (eldbus_message_error_get(msg, &errname, &errmsg))
      {
@@ -773,6 +785,7 @@ ethumb_client_ethumb_setup(Ethumb_Client *client)
    const char *directory, *category;
    double video_time, video_start, video_interval;
    unsigned int video_ntimes, video_fps, document_page;
+   Eldbus_Pending *pending;
 
    EINA_SAFETY_ON_NULL_RETURN(client);
    EINA_SAFETY_ON_FALSE_RETURN(client->connected);
@@ -872,8 +885,10 @@ ethumb_client_ethumb_setup(Ethumb_Client *client)
 
    eldbus_message_iter_container_close(main_iter, array);
 
-   eldbus_proxy_send(client->proxy, msg, _ethumb_client_ethumb_setup_cb,
-                    client, -1);
+   pending = eldbus_proxy_send(client->proxy, msg,
+                               _ethumb_client_ethumb_setup_cb, client, -1);
+   if (pending)
+     client->dbus_pending = eina_list_append(client->dbus_pending, pending);
 }
 
 /**

-- 


Reply via email to