Skip to content

Commit 8a6c1d9

Browse files
Thalleyaescolar
authored andcommitted
Bluetooth: BAP: Broadcast source: Add LTV validation for LC3 data
When using the LC3 codec, all codec configuration are LTV encoded. The broadcast source did not properly validate this, and it also uncovered a bug in the bsim test for broadcast sources. Signed-off-by: Emil Gydesen <[email protected]>
1 parent e08301b commit 8a6c1d9

File tree

5 files changed

+36
-3
lines changed

5 files changed

+36
-3
lines changed

subsys/bluetooth/audio/bap_broadcast_source.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,21 +578,29 @@ static bool valid_broadcast_source_param(const struct bt_bap_broadcast_source_pa
578578
return false;
579579
}
580580

581+
#if CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE > 0
581582
CHECKIF(stream_param->data == NULL && stream_param->data_len != 0) {
582583
LOG_DBG("subgroup_params[%zu].stream_params[%zu]->data is "
583584
"NULL with len %zu",
584585
i, j, stream_param->data_len);
585586
return false;
586587
}
587588

588-
#if CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE > 0
589589
CHECKIF(stream_param->data_len > CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE) {
590590
LOG_DBG("subgroup_params[%zu].stream_params[%zu]->data_len too "
591591
"large: %zu > %d",
592592
i, j, stream_param->data_len,
593593
CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE);
594594
return false;
595595
}
596+
597+
CHECKIF(subgroup_param->codec_cfg->id == BT_HCI_CODING_FORMAT_LC3 &&
598+
!bt_audio_valid_ltv(stream_param->data, stream_param->data_len)) {
599+
LOG_DBG("subgroup_params[%zu].stream_params[%zu]->data not valid "
600+
"LTV",
601+
i, j);
602+
return false;
603+
}
596604
}
597605
#endif /* CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE > 0 */
598606
}

subsys/bluetooth/audio/bap_stream.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,17 @@ enum bt_bap_ascs_reason bt_audio_verify_qos(const struct bt_audio_codec_qos *qos
180180
return BT_BAP_ASCS_REASON_NONE;
181181
}
182182

183+
static bool valid_ltv_cb(struct bt_data *data, void *user_data)
184+
{
185+
/* just return true to continue parsing as bt_data_parse will validate for us */
186+
return true;
187+
}
188+
189+
bool bt_audio_valid_ltv(const uint8_t *data, uint8_t data_len)
190+
{
191+
return bt_audio_data_parse(data, data_len, valid_ltv_cb, NULL) == 0;
192+
}
193+
183194
bool bt_audio_valid_codec_cfg(const struct bt_audio_codec_cfg *codec_cfg)
184195
{
185196
if (codec_cfg == NULL) {
@@ -212,13 +223,25 @@ bool bt_audio_valid_codec_cfg(const struct bt_audio_codec_cfg *codec_cfg)
212223
LOG_DBG("codec_cfg->data_len (%zu) is invalid", codec_cfg->data_len);
213224
return false;
214225
}
226+
227+
if (codec_cfg->id == BT_HCI_CODING_FORMAT_LC3 &&
228+
!bt_audio_valid_ltv(codec_cfg->data, codec_cfg->data_len)) {
229+
LOG_DBG("codec_cfg->data not valid LTV");
230+
return false;
231+
}
215232
#endif /* CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE > 0 */
216233

217234
#if CONFIG_BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE > 0
218235
if (codec_cfg->meta_len > CONFIG_BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE) {
219236
LOG_DBG("codec_cfg->meta_len (%zu) is invalid", codec_cfg->meta_len);
220237
return false;
221238
}
239+
240+
if (codec_cfg->id == BT_HCI_CODING_FORMAT_LC3 &&
241+
!bt_audio_valid_ltv(codec_cfg->data, codec_cfg->data_len)) {
242+
LOG_DBG("codec_cfg->meta not valid LTV");
243+
return false;
244+
}
222245
#endif /* CONFIG_BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE > 0 */
223246

224247
return true;

subsys/bluetooth/audio/bap_stream.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ void bt_audio_codec_qos_to_iso_qos(struct bt_iso_chan_io_qos *io,
2323
void bt_bap_stream_detach(struct bt_bap_stream *stream);
2424

2525
enum bt_bap_ascs_reason bt_audio_verify_qos(const struct bt_audio_codec_qos *qos);
26+
bool bt_audio_valid_ltv(const uint8_t *data, uint8_t data_len);
2627
bool bt_audio_valid_codec_cfg(const struct bt_audio_codec_cfg *codec_cfg);
2728
bool bt_bap_stream_can_disconnect(const struct bt_bap_stream *stream);
2829

tests/bluetooth/audio/bap_broadcast_source/uut/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#
88

99
add_library(uut STATIC
10+
${ZEPHYR_BASE}/subsys/bluetooth/audio/audio.c
1011
${ZEPHYR_BASE}/subsys/bluetooth/audio/bap_iso.c
1112
${ZEPHYR_BASE}/subsys/bluetooth/audio/bap_stream.c
1213
${ZEPHYR_BASE}/subsys/bluetooth/audio/bap_broadcast_source.c

tests/bsim/bluetooth/audio/src/bap_broadcast_source_test.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ static struct bt_bap_stream_ops stream_ops = {
9797
static int setup_broadcast_source(struct bt_bap_broadcast_source **source)
9898
{
9999
uint8_t bis_codec_data[] = {
100-
BT_AUDIO_CODEC_DATA(BT_AUDIO_CODEC_CFG_FREQ,
101-
BT_BYTES_LIST_LE16(BT_AUDIO_CODEC_CFG_FREQ_16KHZ)),
100+
BT_AUDIO_CODEC_DATA(BT_AUDIO_CODEC_CFG_CHAN_ALLOC,
101+
BT_BYTES_LIST_LE32(BT_AUDIO_LOCATION_FRONT_LEFT)),
102102
};
103103
struct bt_bap_broadcast_source_stream_param
104104
stream_params[ARRAY_SIZE(broadcast_source_streams)];

0 commit comments

Comments
 (0)