]> code.delx.au - pulseaudio/commitdiff
bluetooth: Don't access a transport after it's freed.
authorTanu Kaskinen <tanuk@iki.fi>
Tue, 18 Dec 2012 06:47:58 +0000 (08:47 +0200)
committerTanu Kaskinen <tanuk@iki.fi>
Wed, 19 Dec 2012 10:31:50 +0000 (12:31 +0200)
In addition to moving the freeing a bit later, unnecessary checks for
t->device are removed. t->device is initialized to a non-NULL value
when the transport is created, and it's never changed.

src/modules/bluetooth/bluetooth-util.c

index 392f4a5a4d39338def9ed34166a41545ab01fca8..61c52f565e6c672147cb5d9ced21fbc8f8ecb1b3 100644 (file)
@@ -1388,17 +1388,18 @@ static DBusMessage *endpoint_clear_configuration(DBusConnection *c, DBusMessage
     }
 
     if ((t = pa_hashmap_get(y->transports, path))) {
-        bool old_any_connected = t->device ? pa_bluetooth_device_any_audio_connected(t->device) : false;
+        bool old_any_connected = pa_bluetooth_device_any_audio_connected(t->device);
 
         pa_log_debug("Clearing transport %s profile %d", t->path, t->profile);
         t->device->transports[t->profile] = NULL;
         pa_hashmap_remove(y->transports, t->path);
         t->state = PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED;
         pa_hook_fire(&y->hooks[PA_BLUETOOTH_HOOK_TRANSPORT_STATE_CHANGED], t);
-        transport_free(t);
 
-        if (t->device && old_any_connected != pa_bluetooth_device_any_audio_connected(t->device))
+        if (old_any_connected != pa_bluetooth_device_any_audio_connected(t->device))
             run_callback(t->device, FALSE);
+
+        transport_free(t);
     }
 
     pa_assert_se(r = dbus_message_new_method_return(m));