Loading system/bta/ag/bta_ag_sdp.cc +6 −2 Original line number Diff line number Diff line Loading @@ -374,7 +374,9 @@ bool bta_ag_sdp_find_attr(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK service) { } /* get features if HFP */ p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES); if (p_attr != nullptr) { if (p_attr != nullptr && SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) { /* Found attribute. Get value. */ /* There might be race condition between SDP and BRSF. */ /* Do not update if we already received BRSF. */ Loading Loading @@ -417,7 +419,9 @@ bool bta_ag_sdp_find_attr(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK service) { /* get features if HSP */ p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL); if (p_attr != nullptr) { if (p_attr != nullptr && SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == BOOLEAN_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 1) { /* Remote volume control of HSP */ if (p_attr->attr_value.v.u8) p_scb->peer_features |= BTA_AG_PEER_FEAT_VOL; Loading system/bta/av/bta_av_act.cc +6 −2 Original line number Diff line number Diff line Loading @@ -1751,7 +1751,9 @@ tBTA_AV_FEAT bta_av_check_peer_features(uint16_t service_uuid) { if (peer_rc_version >= AVRC_REV_1_4) { /* get supported categories */ p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES); if (p_attr != NULL) { if (p_attr != NULL && SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) { categories = p_attr->attr_value.v.u16; if (categories & AVRC_SUPF_CT_CAT2) peer_features |= (BTA_AV_FEAT_ADV_CTRL); Loading Loading @@ -1815,7 +1817,9 @@ tBTA_AV_FEAT bta_avk_check_peer_features(uint16_t service_uuid) { /* Get supported features */ tSDP_DISC_ATTR* p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES); if (p_attr != NULL) { if (p_attr != NULL && SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) { uint16_t categories = p_attr->attr_value.v.u16; /* * Though Absolute Volume came after in 1.4 and above, but there are Loading system/bta/dm/bta_dm_act.cc +3 −1 Original line number Diff line number Diff line Loading @@ -1109,7 +1109,9 @@ void bta_dm_disc_rmt_name(tBTA_DM_MSG* p_data) { static void store_avrcp_profile_feature(tSDP_DISC_REC* sdp_rec) { tSDP_DISC_ATTR* p_attr = SDP_FindAttributeInRec(sdp_rec, ATTR_ID_SUPPORTED_FEATURES); if (p_attr == NULL) { if (p_attr == NULL || SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != UINT_DESC_TYPE || SDP_DISC_ATTR_LEN(p_attr->attr_len_type) < 2) { return; } Loading system/bta/hf_client/bta_hf_client_sdp.cc +6 −2 Original line number Diff line number Diff line Loading @@ -250,7 +250,9 @@ bool bta_hf_client_sdp_find_attr(tBTA_HF_CLIENT_CB* client_cb) { /* get features */ p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES); if (p_attr != NULL) { if (p_attr != NULL && SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) { /* Found attribute. Get value. */ /* There might be race condition between SDP and BRSF. */ /* Do not update if we already received BRSF. */ Loading @@ -265,7 +267,9 @@ bool bta_hf_client_sdp_find_attr(tBTA_HF_CLIENT_CB* client_cb) { /* get network for ability to reject calls */ p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_NETWORK); if (p_attr != NULL) { if (p_attr != NULL && SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) { if (p_attr->attr_value.v.u16 == 0x01) { client_cb->peer_features |= BTA_HF_CLIENT_PEER_REJECT; } Loading system/bta/sdp/bta_sdp_act.cc +191 −46 Original line number Diff line number Diff line Loading @@ -50,14 +50,27 @@ static void bta_create_mns_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 4) { record->mns.supported_features = p_attr->attr_value.v.u32; } else { LOG_ERROR("ATTR_ID_MAP_SUPPORTED_FEATURES attr type or size wrong!!"); } } else { LOG_ERROR("ATTR_ID_MAP_SUPPORTED_FEATURES attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) { record->mns.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->mns.hdr.service_name = (char*)p_attr->attr_value.v.array; } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr type not TEXT_STR_DESC_TYPE!!"); } } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!"); } if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_MAP_PROFILE, Loading @@ -71,7 +84,14 @@ static void bta_create_mns_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->mns.hdr.l2cap_psm = p_attr->attr_value.v.u16; } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr not found!!"); } } Loading @@ -93,24 +113,51 @@ static void bta_create_mas_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAS_INSTANCE_ID); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 1) { record->mas.mas_instance_id = p_attr->attr_value.v.u8; } else { LOG_ERROR("ATTR_ID_MAS_INSTANCE_ID attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_MAS_INSTANCE_ID attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_MSG_TYPE); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 1) { record->mas.supported_message_types = p_attr->attr_value.v.u8; } else { LOG_ERROR("ATTR_ID_SUPPORTED_MSG_TYPE attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_SUPPORTED_MSG_TYPE attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 4) { record->mas.supported_features = p_attr->attr_value.v.u32; } else { LOG_ERROR("ATTR_ID_MAP_SUPPORTED_FEATURES attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_MAP_SUPPORTED_FEATURES attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) { record->mas.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->mas.hdr.service_name = (char*)p_attr->attr_value.v.array; } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr type wrong!!"); } } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!"); } if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_MAP_PROFILE, Loading @@ -124,7 +171,14 @@ static void bta_create_mas_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->mas.hdr.l2cap_psm = p_attr->attr_value.v.u16; } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr not found!!"); } } Loading @@ -145,18 +199,39 @@ static void bta_create_pse_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_REPOSITORIES); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 1) { record->pse.supported_repositories = p_attr->attr_value.v.u8; } else { LOG_ERROR("ATTR_ID_SUPPORTED_REPOSITORIES attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_SUPPORTED_REPOSITORIES attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PBAP_SUPPORTED_FEATURES); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 4) { record->pse.supported_features = p_attr->attr_value.v.u32; } else { LOG_ERROR("ATTR_ID_PBAP_SUPPORTED_FEATURES attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_PBAP_SUPPORTED_FEATURES attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) { record->pse.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); // TODO: validate the lifetime of this value record->pse.hdr.service_name = (char*)p_attr->attr_value.v.array; } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr type NOT string!!"); } } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!"); } if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_PHONE_ACCESS, Loading @@ -170,7 +245,14 @@ static void bta_create_pse_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->pse.hdr.l2cap_psm = p_attr->attr_value.v.u16; } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr not found!!"); } } Loading @@ -190,9 +272,15 @@ static void bta_create_ops_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) { record->ops.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->ops.hdr.service_name = (char*)p_attr->attr_value.v.array; } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr type NOT string!!"); } } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!"); } if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_OBEX_OBJECT_PUSH, Loading @@ -206,8 +294,16 @@ static void bta_create_ops_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->ops.hdr.l2cap_psm = p_attr->attr_value.v.u16; } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FORMATS_LIST); if (p_attr != NULL) { /* Safety check - each entry should itself be a sequence */ Loading Loading @@ -274,9 +370,15 @@ static void bta_create_sap_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) { record->sap.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->sap.hdr.service_name = (char*)p_attr->attr_value.v.array; } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr type NOT string!!"); } } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!"); } if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_SAP, &pversion)) { Loading Loading @@ -304,43 +406,80 @@ static void bta_create_dip_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SPECIFICATION_ID); if (p_attr != nullptr) if (p_attr != nullptr) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->dip.spec_id = p_attr->attr_value.v.u16; else } else { LOG_ERROR("ATTR_ID_SPECIFICATION_ID attr type or len wrong!!"); } } else { APPL_TRACE_ERROR("%s() ATTR_ID_SPECIFICATION_ID not found", __func__); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_VENDOR_ID); if (p_attr != nullptr) if (p_attr != nullptr) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->dip.vendor = p_attr->attr_value.v.u16; else } else { LOG_ERROR("ATTR_ID_VENDOR_ID attr type or len wrong!!"); } } else { APPL_TRACE_ERROR("%s() ATTR_ID_VENDOR_ID not found", __func__); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_VENDOR_ID_SOURCE); if (p_attr != nullptr) if (p_attr != nullptr) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->dip.vendor_id_source = p_attr->attr_value.v.u16; else } else { LOG_ERROR("ATTR_ID_VENDOR_ID_SOURCE attr type or len wrong!!"); } } else { APPL_TRACE_ERROR("%s() ATTR_ID_VENDOR_ID_SOURCE not found", __func__); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PRODUCT_ID); if (p_attr != nullptr) if (p_attr != nullptr) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->dip.product = p_attr->attr_value.v.u16; else } else { LOG_ERROR("ATTR_ID_PRODUCT_ID attr type or len wrong!!"); } } else { APPL_TRACE_ERROR("%s() ATTR_ID_PRODUCT_ID not found", __func__); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PRODUCT_VERSION); if (p_attr != nullptr) if (p_attr != nullptr) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->dip.version = p_attr->attr_value.v.u16; else } else { LOG_ERROR("ATTR_ID_PRODUCT_VERSION attr type or len wrong!!"); } } else { APPL_TRACE_ERROR("%s() ATTR_ID_PRODUCT_VERSION not found", __func__); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PRIMARY_RECORD); if (p_attr != nullptr) if (p_attr != nullptr) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == BOOLEAN_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 1) { record->dip.primary_record = !(!p_attr->attr_value.v.u8); else } else { LOG_ERROR("ATTR_ID_PRIMARY_RECORD attr type or len wrong!!"); } } else { APPL_TRACE_ERROR("%s() ATTR_ID_PRIMARY_RECORD not found", __func__); } } static void bta_create_raw_sdp_record(bluetooth_sdp_record* record, tSDP_DISC_REC* p_rec) { Loading @@ -357,9 +496,15 @@ static void bta_create_raw_sdp_record(bluetooth_sdp_record* record, /* Try to extract a service name */ p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) { record->pse.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->pse.hdr.service_name = (char*)p_attr->attr_value.v.array; } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr type NOT string!!"); } } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!"); } /* Try to extract an RFCOMM channel */ Loading Loading
system/bta/ag/bta_ag_sdp.cc +6 −2 Original line number Diff line number Diff line Loading @@ -374,7 +374,9 @@ bool bta_ag_sdp_find_attr(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK service) { } /* get features if HFP */ p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES); if (p_attr != nullptr) { if (p_attr != nullptr && SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) { /* Found attribute. Get value. */ /* There might be race condition between SDP and BRSF. */ /* Do not update if we already received BRSF. */ Loading Loading @@ -417,7 +419,9 @@ bool bta_ag_sdp_find_attr(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK service) { /* get features if HSP */ p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL); if (p_attr != nullptr) { if (p_attr != nullptr && SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == BOOLEAN_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 1) { /* Remote volume control of HSP */ if (p_attr->attr_value.v.u8) p_scb->peer_features |= BTA_AG_PEER_FEAT_VOL; Loading
system/bta/av/bta_av_act.cc +6 −2 Original line number Diff line number Diff line Loading @@ -1751,7 +1751,9 @@ tBTA_AV_FEAT bta_av_check_peer_features(uint16_t service_uuid) { if (peer_rc_version >= AVRC_REV_1_4) { /* get supported categories */ p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES); if (p_attr != NULL) { if (p_attr != NULL && SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) { categories = p_attr->attr_value.v.u16; if (categories & AVRC_SUPF_CT_CAT2) peer_features |= (BTA_AV_FEAT_ADV_CTRL); Loading Loading @@ -1815,7 +1817,9 @@ tBTA_AV_FEAT bta_avk_check_peer_features(uint16_t service_uuid) { /* Get supported features */ tSDP_DISC_ATTR* p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES); if (p_attr != NULL) { if (p_attr != NULL && SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) { uint16_t categories = p_attr->attr_value.v.u16; /* * Though Absolute Volume came after in 1.4 and above, but there are Loading
system/bta/dm/bta_dm_act.cc +3 −1 Original line number Diff line number Diff line Loading @@ -1109,7 +1109,9 @@ void bta_dm_disc_rmt_name(tBTA_DM_MSG* p_data) { static void store_avrcp_profile_feature(tSDP_DISC_REC* sdp_rec) { tSDP_DISC_ATTR* p_attr = SDP_FindAttributeInRec(sdp_rec, ATTR_ID_SUPPORTED_FEATURES); if (p_attr == NULL) { if (p_attr == NULL || SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != UINT_DESC_TYPE || SDP_DISC_ATTR_LEN(p_attr->attr_len_type) < 2) { return; } Loading
system/bta/hf_client/bta_hf_client_sdp.cc +6 −2 Original line number Diff line number Diff line Loading @@ -250,7 +250,9 @@ bool bta_hf_client_sdp_find_attr(tBTA_HF_CLIENT_CB* client_cb) { /* get features */ p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES); if (p_attr != NULL) { if (p_attr != NULL && SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) { /* Found attribute. Get value. */ /* There might be race condition between SDP and BRSF. */ /* Do not update if we already received BRSF. */ Loading @@ -265,7 +267,9 @@ bool bta_hf_client_sdp_find_attr(tBTA_HF_CLIENT_CB* client_cb) { /* get network for ability to reject calls */ p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_NETWORK); if (p_attr != NULL) { if (p_attr != NULL && SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) { if (p_attr->attr_value.v.u16 == 0x01) { client_cb->peer_features |= BTA_HF_CLIENT_PEER_REJECT; } Loading
system/bta/sdp/bta_sdp_act.cc +191 −46 Original line number Diff line number Diff line Loading @@ -50,14 +50,27 @@ static void bta_create_mns_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 4) { record->mns.supported_features = p_attr->attr_value.v.u32; } else { LOG_ERROR("ATTR_ID_MAP_SUPPORTED_FEATURES attr type or size wrong!!"); } } else { LOG_ERROR("ATTR_ID_MAP_SUPPORTED_FEATURES attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) { record->mns.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->mns.hdr.service_name = (char*)p_attr->attr_value.v.array; } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr type not TEXT_STR_DESC_TYPE!!"); } } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!"); } if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_MAP_PROFILE, Loading @@ -71,7 +84,14 @@ static void bta_create_mns_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->mns.hdr.l2cap_psm = p_attr->attr_value.v.u16; } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr not found!!"); } } Loading @@ -93,24 +113,51 @@ static void bta_create_mas_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAS_INSTANCE_ID); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 1) { record->mas.mas_instance_id = p_attr->attr_value.v.u8; } else { LOG_ERROR("ATTR_ID_MAS_INSTANCE_ID attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_MAS_INSTANCE_ID attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_MSG_TYPE); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 1) { record->mas.supported_message_types = p_attr->attr_value.v.u8; } else { LOG_ERROR("ATTR_ID_SUPPORTED_MSG_TYPE attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_SUPPORTED_MSG_TYPE attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 4) { record->mas.supported_features = p_attr->attr_value.v.u32; } else { LOG_ERROR("ATTR_ID_MAP_SUPPORTED_FEATURES attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_MAP_SUPPORTED_FEATURES attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) { record->mas.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->mas.hdr.service_name = (char*)p_attr->attr_value.v.array; } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr type wrong!!"); } } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!"); } if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_MAP_PROFILE, Loading @@ -124,7 +171,14 @@ static void bta_create_mas_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->mas.hdr.l2cap_psm = p_attr->attr_value.v.u16; } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr not found!!"); } } Loading @@ -145,18 +199,39 @@ static void bta_create_pse_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_REPOSITORIES); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 1) { record->pse.supported_repositories = p_attr->attr_value.v.u8; } else { LOG_ERROR("ATTR_ID_SUPPORTED_REPOSITORIES attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_SUPPORTED_REPOSITORIES attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PBAP_SUPPORTED_FEATURES); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 4) { record->pse.supported_features = p_attr->attr_value.v.u32; } else { LOG_ERROR("ATTR_ID_PBAP_SUPPORTED_FEATURES attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_PBAP_SUPPORTED_FEATURES attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) { record->pse.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); // TODO: validate the lifetime of this value record->pse.hdr.service_name = (char*)p_attr->attr_value.v.array; } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr type NOT string!!"); } } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!"); } if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_PHONE_ACCESS, Loading @@ -170,7 +245,14 @@ static void bta_create_pse_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->pse.hdr.l2cap_psm = p_attr->attr_value.v.u16; } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr not found!!"); } } Loading @@ -190,9 +272,15 @@ static void bta_create_ops_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) { record->ops.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->ops.hdr.service_name = (char*)p_attr->attr_value.v.array; } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr type NOT string!!"); } } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!"); } if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_OBEX_OBJECT_PUSH, Loading @@ -206,8 +294,16 @@ static void bta_create_ops_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->ops.hdr.l2cap_psm = p_attr->attr_value.v.u16; } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr type or len wrong!!"); } } else { LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr not found!!"); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FORMATS_LIST); if (p_attr != NULL) { /* Safety check - each entry should itself be a sequence */ Loading Loading @@ -274,9 +370,15 @@ static void bta_create_sap_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) { record->sap.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->sap.hdr.service_name = (char*)p_attr->attr_value.v.array; } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr type NOT string!!"); } } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!"); } if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_SAP, &pversion)) { Loading Loading @@ -304,43 +406,80 @@ static void bta_create_dip_sdp_record(bluetooth_sdp_record* record, p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SPECIFICATION_ID); if (p_attr != nullptr) if (p_attr != nullptr) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->dip.spec_id = p_attr->attr_value.v.u16; else } else { LOG_ERROR("ATTR_ID_SPECIFICATION_ID attr type or len wrong!!"); } } else { APPL_TRACE_ERROR("%s() ATTR_ID_SPECIFICATION_ID not found", __func__); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_VENDOR_ID); if (p_attr != nullptr) if (p_attr != nullptr) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->dip.vendor = p_attr->attr_value.v.u16; else } else { LOG_ERROR("ATTR_ID_VENDOR_ID attr type or len wrong!!"); } } else { APPL_TRACE_ERROR("%s() ATTR_ID_VENDOR_ID not found", __func__); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_VENDOR_ID_SOURCE); if (p_attr != nullptr) if (p_attr != nullptr) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->dip.vendor_id_source = p_attr->attr_value.v.u16; else } else { LOG_ERROR("ATTR_ID_VENDOR_ID_SOURCE attr type or len wrong!!"); } } else { APPL_TRACE_ERROR("%s() ATTR_ID_VENDOR_ID_SOURCE not found", __func__); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PRODUCT_ID); if (p_attr != nullptr) if (p_attr != nullptr) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->dip.product = p_attr->attr_value.v.u16; else } else { LOG_ERROR("ATTR_ID_PRODUCT_ID attr type or len wrong!!"); } } else { APPL_TRACE_ERROR("%s() ATTR_ID_PRODUCT_ID not found", __func__); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PRODUCT_VERSION); if (p_attr != nullptr) if (p_attr != nullptr) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) { record->dip.version = p_attr->attr_value.v.u16; else } else { LOG_ERROR("ATTR_ID_PRODUCT_VERSION attr type or len wrong!!"); } } else { APPL_TRACE_ERROR("%s() ATTR_ID_PRODUCT_VERSION not found", __func__); } p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PRIMARY_RECORD); if (p_attr != nullptr) if (p_attr != nullptr) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == BOOLEAN_DESC_TYPE && SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 1) { record->dip.primary_record = !(!p_attr->attr_value.v.u8); else } else { LOG_ERROR("ATTR_ID_PRIMARY_RECORD attr type or len wrong!!"); } } else { APPL_TRACE_ERROR("%s() ATTR_ID_PRIMARY_RECORD not found", __func__); } } static void bta_create_raw_sdp_record(bluetooth_sdp_record* record, tSDP_DISC_REC* p_rec) { Loading @@ -357,9 +496,15 @@ static void bta_create_raw_sdp_record(bluetooth_sdp_record* record, /* Try to extract a service name */ p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME); if (p_attr != NULL) { if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) { record->pse.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->pse.hdr.service_name = (char*)p_attr->attr_value.v.array; } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr type NOT string!!"); } } else { LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!"); } /* Try to extract an RFCOMM channel */ Loading