Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bc697473 authored by Jakub Pawłowski's avatar Jakub Pawłowski Committed by Automerger Merge Worker
Browse files

Merge "Use AdvertiseDataParser::GetFieldByType in loops properly" into tm-qpr-dev am: 9ead4729

parents 33f7b381 9ead4729
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1131,14 +1131,14 @@ class CsisClientImpl : public CsisClient {
  std::vector<RawAddress> GetAllRsiFromAdvertising(
      const tBTA_DM_INQ_RES* result) {
    const uint8_t* p_service_data = result->p_eir;
    uint16_t remaining_data_len = result->eir_len;
    std::vector<RawAddress> devices;
    uint8_t service_data_len = 0;

    while ((p_service_data = AdvertiseDataParser::GetFieldByType(
                p_service_data + service_data_len,
                (remaining_data_len -= service_data_len), BTM_BLE_AD_TYPE_RSI,
                &service_data_len))) {
                result->eir_len - (p_service_data - result->p_eir) -
                    service_data_len,
                BTM_BLE_AD_TYPE_RSI, &service_data_len))) {
      RawAddress bda;
      STREAM_TO_BDADDR(bda, p_service_data);
      devices.push_back(std::move(bda));
+1 −2
Original line number Diff line number Diff line
@@ -2431,12 +2431,11 @@ void btm_ble_update_inq_result(tINQ_DB_ENT* p_i, uint8_t addr_type,
    }

    const uint8_t* p_service_data = data.data();
    uint16_t remaining_data_len = data.size();
    uint8_t service_data_len = 0;

    while ((p_service_data = AdvertiseDataParser::GetFieldByType(
                p_service_data + service_data_len,
                (remaining_data_len -= service_data_len),
                data.size() - (p_service_data - data.data()) - service_data_len,
                BTM_BLE_AD_TYPE_SERVICE_DATA_TYPE, &service_data_len))) {
      uint16_t uuid;
      STREAM_TO_UINT16(uuid, p_service_data);
+1 −2
Original line number Diff line number Diff line
@@ -121,12 +121,11 @@ std::set<tAPP_ID> get_apps_connecting_to(const RawAddress& address) {

bool IsTargetedAnnouncement(const uint8_t* p_eir, uint16_t eir_len) {
  const uint8_t* p_service_data = p_eir;
  uint16_t remaining_data_len = eir_len;
  uint8_t service_data_len = 0;

  while ((p_service_data = AdvertiseDataParser::GetFieldByType(
              p_service_data + service_data_len,
              (remaining_data_len -= service_data_len),
              eir_len - (p_service_data - p_eir) - service_data_len,
              BTM_BLE_AD_TYPE_SERVICE_DATA_TYPE, &service_data_len))) {
    uint16_t uuid;
    uint8_t announcement_type;
+36 −0
Original line number Diff line number Diff line
@@ -175,3 +175,39 @@ TEST(AdvertiseDataParserTest, RemoveTrailingZerosMalformed) {

  EXPECT_TRUE(AdvertiseDataParser::IsValid(glued));
}

TEST(AdvertiseDataParserTest, GetFieldByTypeInLoop) {
  // Single field.
  const uint8_t AD_TYPE_SVC_DATA = 0x16;
  const std::vector<uint8_t> data0{
    0x02, 0x01, 0x02,
    0x07, 0x2e, 0x6a, 0xc1, 0x19, 0x52, 0x1e, 0x49,
    0x09, 0x16, 0x4e, 0x18, 0x00, 0xff, 0x0f, 0x03, 0x00, 0x00,
    0x02, 0x0a, 0x7f,
    0x03, 0x16, 0x4f, 0x18,
    0x04, 0x16, 0x53, 0x18, 0x00,
    0x0f, 0x09, 0x48, 0x5f, 0x43, 0x33, 0x45, 0x41, 0x31, 0x36, 0x33, 0x46, 0x35, 0x36, 0x34, 0x46 };

  const uint8_t* p_service_data = data0.data();
  uint8_t service_data_len = 0;

  int match_no = 0;
  while ((p_service_data = AdvertiseDataParser::GetFieldByType(
              p_service_data + service_data_len,
              data0.size() - (p_service_data - data0.data()) - service_data_len,
              AD_TYPE_SVC_DATA, &service_data_len))) {
    auto position = (p_service_data - data0.data());
    if (match_no == 0) {
      EXPECT_EQ(position, 13);
      EXPECT_EQ(service_data_len, 8);
    } else if (match_no == 1) {
      EXPECT_EQ(position, 26);
      EXPECT_EQ(service_data_len, 2);
    } else if (match_no == 2) {
      EXPECT_EQ(position, 30);
      EXPECT_EQ(service_data_len, 3);
    }
    match_no++;
  }
  EXPECT_EQ(match_no, 3);
}
 No newline at end of file