Skip to content

Commit b75f069

Browse files
committed
Bluetooth: ISO: Fix issue with CIG being terminated
In the case of a CIG having multiple CIS, and all CIS has been requested to being disconnected (i.e. they all enter the BT_ISO_STATE_DISCONNECTING state), then when the first disconnect complete is handled in bt_iso_chan_disconnected, then the cig->state was prematurely set to BT_ISO_CIG_STATE_INACTIVE. This meant that if the application called bt_iso_cig_terminate when the 2nd CIS entered bt_iso_chan_disconnected and called chan->ops->disconnected(chan, reason) then the CIG would be removed. When the CIS then entered bt_iso_cleanup_acl, it would access removed data from cleanup_cig. Change bt_iso_chan_disconnected to not allow the termination of the CIG until all CIS have entered the BT_ISO_STATE_DISCONNECTED state. Signed-off-by: Emil Gydesen <[email protected]>
1 parent 3d5e9cd commit b75f069

File tree

1 file changed

+1
-2
lines changed
  • subsys/bluetooth/host

1 file changed

+1
-2
lines changed

subsys/bluetooth/host/iso.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,8 +500,7 @@ static void bt_iso_chan_disconnected(struct bt_iso_chan *chan, uint8_t reason)
500500

501501
is_chan_connected = false;
502502
SYS_SLIST_FOR_EACH_CONTAINER(&cig->cis_channels, cis_chan, node) {
503-
if (cis_chan->state == BT_ISO_STATE_CONNECTED ||
504-
cis_chan->state == BT_ISO_STATE_CONNECTING) {
503+
if (cis_chan->state != BT_ISO_STATE_DISCONNECTED) {
505504
is_chan_connected = true;
506505
break;
507506
}

0 commit comments

Comments
 (0)