If a Bluetooth connect is in progress when the network gets removed
the following may happen:

connmand[5092]: Aborting (signal 11) [src/connmand]
connmand[5092]: ++++++++ backtrace ++++++++
connmand[5092]: #0  0x7f4066b8a260 in /lib/x86_64-linux-gnu/libc.so.6
connmand[5092]: #1  0x438950 in connman_device_get_ident() at src/device.c:555
connmand[5092]: #2  0x447301 in connman_service_lookup_from_network() at 
src/service.c:6421
connmand[5092]: #3  0x43aeb8 in set_connect_error() at src/network.c:1296
connmand[5092]: #4  0x43b97d in connman_network_set_connected() at 
src/network.c:1396
connmand[5092]: #5  0x4245f5 in connect_reply() at 
plugins/bluetooth_legacy.c:150
connmand[5092]: #6  0x7f40679fc512 in /lib/x86_64-linux-gnu/libdbus-1.so.3
connmand[5092]: #7  0x7f40679ff741 in /lib/x86_64-linux-gnu/libdbus-1.so.3
connmand[5092]: #8  0x47bbc8 in message_dispatch() at gdbus/mainloop.c:76 
(discriminator 1)
connmand[5092]: #9  0x7f4067c7ea03 in /lib/x86_64-linux-gnu/libglib-2.0.so.0
connmand[5092]: #10 0x7f4067c7dea6 in /lib/x86_64-linux-gnu/libglib-2.0.so.0
connmand[5092]: #11 0x7f4067c7e1f8 in /lib/x86_64-linux-gnu/libglib-2.0.so.0
connmand[5092]: #12 0x7f4067c7e5fa in /lib/x86_64-linux-gnu/libglib-2.0.so.0
connmand[5092]: #13 0x40f7a7 in main() at src/main.c:694
connmand[5092]: #14 0x7f4066b76995 in /lib/x86_64-linux-gnu/libc.so.6

Fix this by supplying the D-Bus path to the callback and looking up the
network instead of providing the whole structure which can have been freed
at the time of the callback.
---
 plugins/bluetooth_legacy.c |   20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/plugins/bluetooth_legacy.c b/plugins/bluetooth_legacy.c
index c1c9fbd..c61356c 100644
--- a/plugins/bluetooth_legacy.c
+++ b/plugins/bluetooth_legacy.c
@@ -98,12 +98,17 @@ static void pan_remove(struct connman_network *network)
 
 static void connect_reply(DBusPendingCall *call, void *user_data)
 {
-       struct connman_network *network = user_data;
+       char *path = user_data;
+       struct connman_network *network;
        DBusMessage *reply;
        DBusError error;
        const char *interface = NULL;
        int index;
 
+       network = g_hash_table_lookup(bluetooth_networks, path);
+       if (!network)
+               return;
+
        DBG("network %p", network);
 
        reply = dbus_pending_call_steal_reply(call);
@@ -187,7 +192,8 @@ static int pan_connect(struct connman_network *network)
                return -EINVAL;
        }
 
-       dbus_pending_call_set_notify(call, connect_reply, network, NULL);
+       dbus_pending_call_set_notify(call, connect_reply, g_strdup(path),
+                       g_free);
 
        dbus_message_unref(message);
 
@@ -196,10 +202,15 @@ static int pan_connect(struct connman_network *network)
 
 static void disconnect_reply(DBusPendingCall *call, void *user_data)
 {
-       struct connman_network *network = user_data;
+       char *path = user_data;
+       struct connman_network *network;
        DBusMessage *reply;
        DBusError error;
 
+       network = g_hash_table_lookup(bluetooth_networks, path);
+       if (!network)
+               return;
+
        DBG("network %p", network);
 
        reply = dbus_pending_call_steal_reply(call);
@@ -268,7 +279,8 @@ static int pan_disconnect(struct connman_network *network)
 
        connman_network_set_associating(network, false);
 
-       dbus_pending_call_set_notify(call, disconnect_reply, network, NULL);
+       dbus_pending_call_set_notify(call, disconnect_reply, g_strdup(path),
+                       g_free);
 
        dbus_message_unref(message);
 
-- 
1.7.10.4

_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman

Reply via email to