system/bt
Revisión | 771973450c41b71b6fc590f17d00b1edcd5fcde6 (tree) |
---|---|
Tiempo | 2020-01-20 19:51:15 |
Autor | Chih-Wei Huang <cwhuang@linu...> |
Commiter | Chih-Wei Huang |
Merge tag 'android-9.0.0_r52' into pie-x86
Android 9.0.0 release 52
@@ -3057,14 +3057,14 @@ void bta_av_open_at_inc(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { | ||
3057 | 3057 | } |
3058 | 3058 | |
3059 | 3059 | void offload_vendor_callback(tBTM_VSC_CMPL* param) { |
3060 | - uint8_t status = 0; | |
3060 | + tBTA_AV value{0}; | |
3061 | 3061 | uint8_t sub_opcode = 0; |
3062 | 3062 | if (param->param_len) { |
3063 | 3063 | APPL_TRACE_DEBUG("%s: param_len = %d status = %d", __func__, |
3064 | 3064 | param->param_len, param->p_param_buf[0]); |
3065 | - status = param->p_param_buf[0]; | |
3065 | + value.status = param->p_param_buf[0]; | |
3066 | 3066 | } |
3067 | - if (status == 0) { | |
3067 | + if (value.status == 0) { | |
3068 | 3068 | sub_opcode = param->p_param_buf[1]; |
3069 | 3069 | APPL_TRACE_DEBUG("%s: subopcode = %d", __func__, sub_opcode); |
3070 | 3070 | switch (sub_opcode) { |
@@ -3072,7 +3072,7 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { | ||
3072 | 3072 | APPL_TRACE_DEBUG("%s: VS_HCI_STOP_A2DP_MEDIA successful", __func__); |
3073 | 3073 | break; |
3074 | 3074 | case VS_HCI_A2DP_OFFLOAD_START: |
3075 | - (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, (tBTA_AV*)&status); | |
3075 | + (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); | |
3076 | 3076 | break; |
3077 | 3077 | default: |
3078 | 3078 | break; |
@@ -3081,7 +3081,7 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { | ||
3081 | 3081 | APPL_TRACE_DEBUG("%s: Offload failed for subopcode= %d", __func__, |
3082 | 3082 | sub_opcode); |
3083 | 3083 | if (param->opcode != VS_HCI_A2DP_OFFLOAD_STOP) |
3084 | - (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, (tBTA_AV*)&status); | |
3084 | + (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); | |
3085 | 3085 | } |
3086 | 3086 | } |
3087 | 3087 |
@@ -88,7 +88,9 @@ void device_class_from_int(bt_device_class_t* dc, int data) { | ||
88 | 88 | int device_class_to_int(const bt_device_class_t* dc) { |
89 | 89 | CHECK(dc != NULL); |
90 | 90 | // Careful with endianess. |
91 | - return (int)(le32toh(*(int*)dc) & 0xffffff); | |
91 | + int val = 0; | |
92 | + memcpy(&val, dc, sizeof(*dc)); | |
93 | + return static_cast<int>(le32toh(val) & 0xffffff); | |
92 | 94 | } |
93 | 95 | |
94 | 96 | bool device_class_equals(const bt_device_class_t* p1, |
@@ -22,9 +22,6 @@ | ||
22 | 22 | |
23 | 23 | #include "btcore/include/device_class.h" |
24 | 24 | |
25 | -// Device Class is 3 bytes. | |
26 | -static const int DC_MASK = 0xffffff; | |
27 | - | |
28 | 25 | ::testing::AssertionResult check_bitfield(const char* m_expr, |
29 | 26 | const char* n_expr, int m, int n) { |
30 | 27 | if (m == n) return ::testing::AssertionSuccess(); |
@@ -84,8 +81,9 @@ TEST_F(DeviceClassTest, to_stream) { | ||
84 | 81 | int rc = device_class_to_stream(&dc, dc_stream1, sizeof(dc_stream1)); |
85 | 82 | EXPECT_EQ(3, rc); |
86 | 83 | |
87 | - uint32_t* val = (uint32_t*)&dc; | |
88 | - EXPECT_PRED_FORMAT2(check_bitfield, 0x00000000, *val & 0xffffff); | |
84 | + uint32_t val = 0; | |
85 | + memcpy(&val, &dc, sizeof(dc)); | |
86 | + EXPECT_PRED_FORMAT2(check_bitfield, 0x00000000, val); | |
89 | 87 | |
90 | 88 | EXPECT_PRED_FORMAT2(check_bitfield, 0x00, dc_stream1[0]); |
91 | 89 | EXPECT_PRED_FORMAT2(check_bitfield, 0x00, dc_stream1[1]); |
@@ -101,8 +99,9 @@ TEST_F(DeviceClassTest, to_stream) { | ||
101 | 99 | |
102 | 100 | int rc = device_class_to_stream(&dc, dc_stream1, sizeof(dc_stream1)); |
103 | 101 | EXPECT_EQ(3, rc); |
104 | - uint32_t* val = (uint32_t*)&dc; | |
105 | - EXPECT_PRED_FORMAT2(check_bitfield, 0x00aa55aa, *val & 0xffffff); | |
102 | + uint32_t val = 0; | |
103 | + memcpy(&val, &dc, sizeof(dc)); | |
104 | + EXPECT_PRED_FORMAT2(check_bitfield, 0x00aa55aa, val); | |
106 | 105 | |
107 | 106 | EXPECT_PRED_FORMAT2(check_bitfield, 0xaa, dc_stream1[0]); |
108 | 107 | EXPECT_PRED_FORMAT2(check_bitfield, 0x55, dc_stream1[1]); |
@@ -118,8 +117,9 @@ TEST_F(DeviceClassTest, to_stream) { | ||
118 | 117 | |
119 | 118 | int rc = device_class_to_stream(&dc, dc_stream1, sizeof(dc_stream1)); |
120 | 119 | EXPECT_EQ(3, rc); |
121 | - uint32_t* val = (uint32_t*)&dc; | |
122 | - EXPECT_PRED_FORMAT2(check_bitfield, 0x452301, *val & 0xffffff); | |
120 | + uint32_t val = 0; | |
121 | + memcpy(&val, &dc, sizeof(dc)); | |
122 | + EXPECT_PRED_FORMAT2(check_bitfield, 0x452301, val); | |
123 | 123 | |
124 | 124 | EXPECT_PRED_FORMAT2(check_bitfield, 0x01, dc_stream1[0]); |
125 | 125 | EXPECT_PRED_FORMAT2(check_bitfield, 0x23, dc_stream1[1]); |
@@ -131,24 +131,33 @@ TEST_F(DeviceClassTest, limited_discoverable_mode) { | ||
131 | 131 | uint8_t dc_stream[] = {0x00, 0x00, 0x00}; |
132 | 132 | bt_device_class_t dc; |
133 | 133 | device_class_from_stream(&dc, dc_stream); |
134 | - uint32_t* test = (uint32_t*)&dc; | |
134 | + uint32_t test = 0; | |
135 | + memcpy(&test, &dc, sizeof(dc)); | |
135 | 136 | |
136 | 137 | EXPECT_FALSE(device_class_get_limited(&dc)); |
137 | - EXPECT_EQ((unsigned)0x00000000, *test & DC_MASK); | |
138 | + EXPECT_EQ((unsigned)0x00000000, test); | |
138 | 139 | |
139 | 140 | device_class_set_limited(&dc, true); |
141 | + test = 0; | |
142 | + memcpy(&test, &dc, sizeof(dc)); | |
140 | 143 | EXPECT_TRUE(device_class_get_limited(&dc)); |
141 | - EXPECT_EQ((unsigned)0x00002000, *test & DC_MASK); | |
144 | + EXPECT_EQ((unsigned)0x00002000, test); | |
142 | 145 | |
143 | 146 | device_class_set_limited(&dc, false); |
147 | + test = 0; | |
148 | + memcpy(&test, &dc, sizeof(dc)); | |
144 | 149 | EXPECT_FALSE(device_class_get_limited(&dc)); |
145 | - EXPECT_EQ((unsigned)0x00000000, *test & DC_MASK); | |
150 | + EXPECT_EQ((unsigned)0x00000000, test); | |
146 | 151 | |
147 | 152 | device_class_set_limited(&dc, true); |
148 | - EXPECT_PRED_FORMAT2(check_bitfield, 0x00002000, *test & DC_MASK); | |
153 | + test = 0; | |
154 | + memcpy(&test, &dc, sizeof(dc)); | |
155 | + EXPECT_PRED_FORMAT2(check_bitfield, 0x00002000, test); | |
149 | 156 | |
150 | 157 | device_class_set_limited(&dc, false); |
151 | - EXPECT_PRED_FORMAT2(check_bitfield, 0x00000000, *test & DC_MASK); | |
158 | + test = 0; | |
159 | + memcpy(&test, &dc, sizeof(dc)); | |
160 | + EXPECT_PRED_FORMAT2(check_bitfield, 0x00000000, test); | |
152 | 161 | } |
153 | 162 | |
154 | 163 | TEST_F(DeviceClassTest, equals) { |
@@ -965,21 +965,12 @@ static void btif_dm_ssp_cfm_req_evt(tBTA_DM_SP_CFM_REQ* p_ssp_cfm_req) { | ||
965 | 965 | |
966 | 966 | /* If JustWorks auto-accept */ |
967 | 967 | if (p_ssp_cfm_req->just_works) { |
968 | - /* Pairing consent for JustWorks needed if: | |
969 | - * 1. Incoming (non-temporary) pairing is detected AND | |
970 | - * 2. local IO capabilities are DisplayYesNo AND | |
971 | - * 3. remote IO capabiltiies are DisplayOnly or NoInputNoOutput; | |
968 | + /* Pairing consent for JustWorks NOT needed if: | |
969 | + * 1. Incoming temporary pairing is detected | |
972 | 970 | */ |
973 | - if (is_incoming && pairing_cb.bond_type != BOND_TYPE_TEMPORARY && | |
974 | - ((p_ssp_cfm_req->loc_io_caps == HCI_IO_CAP_DISPLAY_YESNO) && | |
975 | - (p_ssp_cfm_req->rmt_io_caps == HCI_IO_CAP_DISPLAY_ONLY || | |
976 | - p_ssp_cfm_req->rmt_io_caps == HCI_IO_CAP_NO_IO))) { | |
971 | + if (is_incoming && pairing_cb.bond_type == BOND_TYPE_TEMPORARY) { | |
977 | 972 | BTIF_TRACE_EVENT( |
978 | - "%s: User consent needed for incoming pairing request. loc_io_caps: " | |
979 | - "%d, rmt_io_caps: %d", | |
980 | - __func__, p_ssp_cfm_req->loc_io_caps, p_ssp_cfm_req->rmt_io_caps); | |
981 | - } else { | |
982 | - BTIF_TRACE_EVENT("%s: Auto-accept JustWorks pairing", __func__); | |
973 | + "%s: Auto-accept JustWorks pairing for temporary incoming", __func__); | |
983 | 974 | btif_dm_ssp_reply(&bd_addr, BT_SSP_VARIANT_CONSENT, true, 0); |
984 | 975 | return; |
985 | 976 | } |
@@ -188,8 +188,8 @@ void LowEnergyClient::MtuChangedCallback( | ||
188 | 188 | |
189 | 189 | if (!bda) return; |
190 | 190 | |
191 | - const char* addr = BtAddrString(bda).c_str(); | |
192 | - if (delegate_) delegate_->OnMtuChanged(this, status, addr, mtu); | |
191 | + std::string addr = BtAddrString(bda); | |
192 | + if (delegate_) delegate_->OnMtuChanged(this, status, addr.c_str(), mtu); | |
193 | 193 | } |
194 | 194 | |
195 | 195 | // LowEnergyClientFactory implementation |
@@ -341,11 +341,13 @@ static void process_service_search_rsp(tCONN_CB* p_ccb, uint8_t* p_reply, | ||
341 | 341 | * Description copy the raw data |
342 | 342 | * |
343 | 343 | * |
344 | - * Returns void | |
344 | + * Returns bool | |
345 | + * true if successful | |
346 | + * false if not copied | |
345 | 347 | * |
346 | 348 | ******************************************************************************/ |
347 | 349 | #if (SDP_RAW_DATA_INCLUDED == TRUE) |
348 | -static void sdp_copy_raw_data(tCONN_CB* p_ccb, bool offset) { | |
350 | +static bool sdp_copy_raw_data(tCONN_CB* p_ccb, bool offset) { | |
349 | 351 | unsigned int cpy_len, rem_len; |
350 | 352 | uint32_t list_len; |
351 | 353 | uint8_t* p; |
@@ -376,11 +378,11 @@ static void sdp_copy_raw_data(tCONN_CB* p_ccb, bool offset) { | ||
376 | 378 | p = sdpu_get_len_from_type(p, p_end, type, &list_len); |
377 | 379 | if (p == NULL || (p + list_len) > p_end) { |
378 | 380 | SDP_TRACE_WARNING("%s: bad length", __func__); |
379 | - return; | |
381 | + return false; | |
380 | 382 | } |
381 | 383 | if ((int)cpy_len < (p - old_p)) { |
382 | 384 | SDP_TRACE_WARNING("%s: no bytes left for data", __func__); |
383 | - return; | |
385 | + return false; | |
384 | 386 | } |
385 | 387 | cpy_len -= (p - old_p); |
386 | 388 | } |
@@ -400,6 +402,7 @@ static void sdp_copy_raw_data(tCONN_CB* p_ccb, bool offset) { | ||
400 | 402 | memcpy(&p_ccb->p_db->raw_data[p_ccb->p_db->raw_used], p, cpy_len); |
401 | 403 | p_ccb->p_db->raw_used += cpy_len; |
402 | 404 | } |
405 | + return true; | |
403 | 406 | } |
404 | 407 | #endif |
405 | 408 |
@@ -468,7 +471,11 @@ static void process_service_attr_rsp(tCONN_CB* p_ccb, uint8_t* p_reply, | ||
468 | 471 | } else { |
469 | 472 | #if (SDP_RAW_DATA_INCLUDED == TRUE) |
470 | 473 | SDP_TRACE_WARNING("process_service_attr_rsp"); |
471 | - sdp_copy_raw_data(p_ccb, false); | |
474 | + if (!sdp_copy_raw_data(p_ccb, false)) { | |
475 | + SDP_TRACE_ERROR("sdp_copy_raw_data failed"); | |
476 | + sdp_disconnect(p_ccb, SDP_ILLEGAL_PARAMETER); | |
477 | + } | |
478 | + | |
472 | 479 | #endif |
473 | 480 | |
474 | 481 | /* Save the response in the database. Stop on any error */ |
@@ -693,7 +700,10 @@ static void process_service_search_attr_rsp(tCONN_CB* p_ccb, uint8_t* p_reply, | ||
693 | 700 | |
694 | 701 | #if (SDP_RAW_DATA_INCLUDED == TRUE) |
695 | 702 | SDP_TRACE_WARNING("process_service_search_attr_rsp"); |
696 | - sdp_copy_raw_data(p_ccb, true); | |
703 | + if (!sdp_copy_raw_data(p_ccb, true)) { | |
704 | + SDP_TRACE_ERROR("sdp_copy_raw_data failed"); | |
705 | + sdp_disconnect(p_ccb, SDP_ILLEGAL_PARAMETER); | |
706 | + } | |
697 | 707 | #endif |
698 | 708 | |
699 | 709 | p = &p_ccb->rsp_list[0]; |
@@ -708,6 +718,7 @@ static void process_service_search_attr_rsp(tCONN_CB* p_ccb, uint8_t* p_reply, | ||
708 | 718 | p = sdpu_get_len_from_type(p, p + p_ccb->list_len, type, &seq_len); |
709 | 719 | if (p == NULL || (p + seq_len) > (p + p_ccb->list_len)) { |
710 | 720 | SDP_TRACE_WARNING("%s: bad length", __func__); |
721 | + sdp_disconnect(p_ccb, SDP_ILLEGAL_PARAMETER); | |
711 | 722 | return; |
712 | 723 | } |
713 | 724 | p_end = &p_ccb->rsp_list[p_ccb->list_len]; |