Skip to content

Commit 28e188b

Browse files
Thalleykartben
authored andcommitted
Bluetooth: PACS: Add verification of bt_bap_pacs_register_param
Add verification of the parameter struct, so that it returns -EINVAL if the values are invalid. Signed-off-by: Emil Gydesen <[email protected]>
1 parent b72b33a commit 28e188b

File tree

2 files changed

+46
-3
lines changed
  • include/zephyr/bluetooth/audio
  • subsys/bluetooth/audio

2 files changed

+46
-3
lines changed

include/zephyr/bluetooth/audio/pacs.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,10 @@ void bt_pacs_cap_foreach(enum bt_audio_dir dir,
113113
*
114114
* @param param PACS register parameters.
115115
*
116-
* @return 0 in case of success or negative value in case of error.
116+
* @retval 0 Success
117+
* @retval -EINVAL @p param is NULL or bad combination of values in @p param
118+
* @retval -EALREADY Already registered
119+
* @retval -ENOEXEC Request was rejected by GATT
117120
*/
118121
int bt_pacs_register(const struct bt_bap_pacs_register_param *param);
119122

subsys/bluetooth/audio/pacs.c

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -780,10 +780,50 @@ static void configure_pacs_char(const struct bt_bap_pacs_register_param *param)
780780
pacs_svc.attr_count -= attrs_to_rem;
781781
}
782782

783+
static bool valid_pacs_register_param(const struct bt_bap_pacs_register_param *param)
784+
{
785+
bool any_pac_registered = false;
786+
787+
if (param == NULL) {
788+
LOG_DBG("param is NULL");
789+
return false;
790+
}
791+
792+
#if defined(CONFIG_BT_PAC_SNK)
793+
any_pac_registered |= param->snk_pac;
794+
#endif /* CONFIG_BT_PAC_SNK */
795+
#if defined(CONFIG_BT_PAC_SNK_LOC)
796+
if (param->snk_loc && !param->snk_pac) {
797+
LOG_DBG("Cannot register snk_loc without snk_pac");
798+
return false;
799+
}
800+
#endif /* CONFIG_BT_PAC_SNK_LOC */
801+
#if defined(CONFIG_BT_PAC_SRC)
802+
any_pac_registered |= param->src_pac;
803+
#endif /* CONFIG_BT_PAC_SRC */
804+
#if defined(CONFIG_BT_PAC_SRC_LOC)
805+
if (param->src_loc && !param->src_pac) {
806+
LOG_DBG("Cannot register src_loc without src_pac");
807+
return false;
808+
}
809+
#endif /* CONFIG_BT_PAC_SRC_LOC */
810+
811+
if (!any_pac_registered) {
812+
LOG_DBG("Neither snk_pac or src_pac registered");
813+
return false;
814+
}
815+
816+
return true;
817+
}
818+
783819
int bt_pacs_register(const struct bt_bap_pacs_register_param *param)
784820
{
785821
int err = 0;
786822

823+
if (!valid_pacs_register_param(param)) {
824+
return -EINVAL;
825+
}
826+
787827
if (atomic_test_and_set_bit(pacs.flags, PACS_FLAG_REGISTERED)) {
788828
LOG_DBG("PACS already registered");
789829

@@ -809,10 +849,10 @@ int bt_pacs_register(const struct bt_bap_pacs_register_param *param)
809849

810850
err = bt_gatt_service_register(&pacs_svc);
811851
if (err != 0) {
812-
LOG_DBG("Failed to register ASCS in gatt DB");
852+
LOG_DBG("Failed to register ASCS in gatt DB: %d", err);
813853
atomic_clear_bit(pacs.flags, PACS_FLAG_REGISTERED);
814854

815-
return err;
855+
return -ENOEXEC;
816856
}
817857

818858
return 0;

0 commit comments

Comments
 (0)