In some cases, it is possible that when sco_connect_cb() is called
the .Connect() message (stored in card->msg) is not valid anymore.
---
 src/handsfree-audio.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/src/handsfree-audio.c b/src/handsfree-audio.c
index 3f24a2a..841cc3f 100644
--- a/src/handsfree-audio.c
+++ b/src/handsfree-audio.c
@@ -242,16 +242,19 @@ static gboolean sco_connect_cb(GIOChannel *io, 
GIOCondition cond,
 {
        struct ofono_handsfree_card *card = user_data;
        DBusMessage *reply;
-       int sk;
+       int sk, err;
 
        if (agent == NULL) {
                /* There's no agent, so there's no one to reply to */
-               reply = NULL;
+               if (card->msg)
+                       dbus_message_unref(card->msg);
+
+               card->msg = NULL;
                goto done;
        }
 
        if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) {
-               reply = __ofono_error_failed(card->msg);
+               err = -EIO;
                goto done;
        }
 
@@ -261,14 +264,19 @@ static gboolean sco_connect_cb(GIOChannel *io, 
GIOCondition cond,
 
        close(sk);
 
-       reply = dbus_message_new_method_return(card->msg);
+       err = 0;
 
 done:
-       if (reply)
-               g_dbus_send_message(ofono_dbus_get_connection(), reply);
+       /* Or the msg was already replied to, or the agent exited */
+       if (card->msg == NULL)
+               return FALSE;
 
-       dbus_message_unref(card->msg);
-       card->msg = NULL;
+       if (err < 0)
+               reply = __ofono_error_failed(card->msg);
+       else
+               reply = dbus_message_new_method_return(card->msg);
+
+       __ofono_dbus_pending_reply(&card->msg, reply);
 
        return FALSE;
 }
-- 
1.8.2

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to