For a dual-mode remote, both BR/EDR and BLE may be connected, RemoveDevice should be handled after all bearers are disconnects. Otherwise, if msg is removed, but not all connection are dropped, this function returns before *remove is updated, then after all connections are dropped, but device->disconnects is NULL, remove_device is not updated. Consequently *remove is not set to true. Remove device is not performed in adapter_remove_connection. --- src/device.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/device.c b/src/device.c index f8f61e643..7585184de 100644 --- a/src/device.c +++ b/src/device.c @@ -3488,18 +3488,6 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type, device->connect = NULL; } - while (device->disconnects) { - DBusMessage *msg = device->disconnects->data; - - if (dbus_message_is_method_call(msg, ADAPTER_INTERFACE, - "RemoveDevice")) - remove_device = true; - - g_dbus_send_reply(dbus_conn, msg, DBUS_TYPE_INVALID); - device->disconnects = g_slist_remove(device->disconnects, msg); - dbus_message_unref(msg); - } - /* Check paired status of both bearers since it's possible to be * paired but not connected via link key to LTK conversion. */ @@ -3539,6 +3527,19 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type, g_dbus_emit_property_changed(dbus_conn, device->path, DEVICE_INTERFACE, "Connected"); + /* remove device only if both bearers are disconnected */ + while (device->disconnects) { + DBusMessage *msg = device->disconnects->data; + + if (dbus_message_is_method_call(msg, ADAPTER_INTERFACE, + "RemoveDevice")) + remove_device = true; + + g_dbus_send_reply(dbus_conn, msg, DBUS_TYPE_INVALID); + device->disconnects = g_slist_remove(device->disconnects, msg); + dbus_message_unref(msg); + } + if (remove_device) *remove = remove_device; } -- 2.25.1