Skip to content

Commit

Permalink
Bluetooth: Host: Check returned value by LE_READ_BUFFER_SIZE
Browse files Browse the repository at this point in the history
`rp->le_max_num` was passed unchecked into `k_sem_init()`, this could
lead to the value being uninitialized and an unknown behavior.

To fix that issue, the `rp->le_max_num` value is checked the same way as
`bt_dev.le.acl_mtu` was already checked. The same things has been done
for `rp->acl_max_num` and `rp->iso_max_num` in
`read_buffer_size_v2_complete()` function.

Signed-off-by: Théo Battrel <theo.battrel@nordicsemi.no>
(cherry picked from commit ac3dec5)
  • Loading branch information
theob-pro authored and cfriedt committed Feb 25, 2023
1 parent f882abf commit c3f512d
Showing 1 changed file with 22 additions and 15 deletions.
37 changes: 22 additions & 15 deletions subsys/bluetooth/host/hci_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2503,13 +2503,15 @@ static void le_read_buffer_size_complete(struct net_buf *buf)
BT_DBG("status 0x%02x", rp->status);

#if defined(CONFIG_BT_CONN)
bt_dev.le.acl_mtu = sys_le16_to_cpu(rp->le_max_len);
if (!bt_dev.le.acl_mtu) {
uint16_t acl_mtu = sys_le16_to_cpu(rp->le_max_len);

if (!acl_mtu || !rp->le_max_num) {
return;
}

BT_DBG("ACL LE buffers: pkts %u mtu %u", rp->le_max_num,
bt_dev.le.acl_mtu);
bt_dev.le.acl_mtu = acl_mtu;

BT_DBG("ACL LE buffers: pkts %u mtu %u", rp->le_max_num, bt_dev.le.acl_mtu);

k_sem_init(&bt_dev.le.acl_pkts, rp->le_max_num, rp->le_max_num);
#endif /* CONFIG_BT_CONN */
Expand All @@ -2523,25 +2525,26 @@ static void read_buffer_size_v2_complete(struct net_buf *buf)
BT_DBG("status %u", rp->status);

#if defined(CONFIG_BT_CONN)
bt_dev.le.acl_mtu = sys_le16_to_cpu(rp->acl_max_len);
if (!bt_dev.le.acl_mtu) {
return;
}
uint16_t acl_mtu = sys_le16_to_cpu(rp->acl_max_len);

BT_DBG("ACL LE buffers: pkts %u mtu %u", rp->acl_max_num,
bt_dev.le.acl_mtu);
if (acl_mtu && rp->acl_max_num) {
bt_dev.le.acl_mtu = acl_mtu;
LOG_DBG("ACL LE buffers: pkts %u mtu %u", rp->acl_max_num, bt_dev.le.acl_mtu);

k_sem_init(&bt_dev.le.acl_pkts, rp->acl_max_num, rp->acl_max_num);
k_sem_init(&bt_dev.le.acl_pkts, rp->acl_max_num, rp->acl_max_num);
}
#endif /* CONFIG_BT_CONN */

bt_dev.le.iso_mtu = sys_le16_to_cpu(rp->iso_max_len);
if (!bt_dev.le.iso_mtu) {
uint16_t iso_mtu = sys_le16_to_cpu(rp->iso_max_len);

if (!iso_mtu || !rp->iso_max_num) {
BT_ERR("ISO buffer size not set");
return;
}

BT_DBG("ISO buffers: pkts %u mtu %u", rp->iso_max_num,
bt_dev.le.iso_mtu);
bt_dev.le.iso_mtu = iso_mtu;

BT_DBG("ISO buffers: pkts %u mtu %u", rp->iso_max_num, bt_dev.le.iso_mtu);

k_sem_init(&bt_dev.le.iso_pkts, rp->iso_max_num, rp->iso_max_num);
#endif /* CONFIG_BT_ISO */
Expand Down Expand Up @@ -2810,6 +2813,7 @@ static int le_init_iso(void)
if (err) {
return err;
}

read_buffer_size_v2_complete(rsp);

net_buf_unref(rsp);
Expand All @@ -2823,6 +2827,7 @@ static int le_init_iso(void)
if (err) {
return err;
}

le_read_buffer_size_complete(rsp);

net_buf_unref(rsp);
Expand Down Expand Up @@ -2866,7 +2871,9 @@ static int le_init(void)
if (err) {
return err;
}

le_read_buffer_size_complete(rsp);

net_buf_unref(rsp);
}

Expand Down

0 comments on commit c3f512d

Please sign in to comment.