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

Commit 1272c7ae authored by Chris Manton's avatar Chris Manton
Browse files

stack::btm::btm_process_remote_name Handle null name

Also simplify code parsing and re-enable the disabled test

Bug: 332780644
Test: atest net_test_stack_btm.BtmInqActiveTest*
Flag: EXEMPT, Test Infrastructure
Change-Id: I1eb837cedabe7ae3717756398dfbe3e182fdd4eb
parent a4f46ff6
Loading
Loading
Loading
Loading
+52 −41
Original line number Diff line number Diff line
@@ -1939,31 +1939,29 @@ tBTM_STATUS btm_initiate_rem_name(const RawAddress& remote_bda, uint8_t origin,
 ******************************************************************************/
void btm_process_remote_name(const RawAddress* bda, const BD_NAME bdn,
                             uint16_t /* evt_len */, tHCI_STATUS hci_status) {
  tBTM_REMOTE_DEV_NAME rem_name;
  tBTM_NAME_CMPL_CB* p_cb = btm_cb.btm_inq_vars.p_remname_cmpl_cb;

  if (bda) {
    rem_name.bd_addr = *bda;
  } else {
    rem_name.bd_addr = RawAddress::kEmpty;
  }

  log::info("btm_process_remote_name for {}",
            ADDRESS_TO_LOGGABLE_CSTR(rem_name.bd_addr));
  tBTM_REMOTE_DEV_NAME rem_name = {
      .status = BTM_BAD_VALUE_RET,
      .bd_addr = bda ? *bda : RawAddress::kEmpty,
      .remote_bd_name = {},
      .hci_status = hci_status,
  };

  log::verbose("Inquire BDA {}",
               ADDRESS_TO_LOGGABLE_CSTR(btm_cb.btm_inq_vars.remname_bda));
  const bool on_le_link = BTM_UseLeLink(btm_cb.btm_inq_vars.remname_bda);

  /* If the inquire BDA and remote DBA are the same, then stop the timer and set
   * the active to false */
  if ((btm_cb.btm_inq_vars.remname_active) &&
      (!bda || (*bda == btm_cb.btm_inq_vars.remname_bda))) {
    if (BTM_UseLeLink(btm_cb.btm_inq_vars.remname_bda)) {
      if (hci_status == HCI_ERR_UNSPECIFIED)
  if (btm_cb.btm_inq_vars.remname_active) {
    if (rem_name.bd_addr == RawAddress::kEmpty ||
        rem_name.bd_addr == btm_cb.btm_inq_vars.remname_bda) {
      log::info(
          "RNR received expected name bd_addr:{} hci_status:{} le_link:{}",
          rem_name.bd_addr.ToRedactedStringForLogging(),
          hci_status_code_text(hci_status), logbool(on_le_link));

      if (on_le_link && hci_status == HCI_ERR_UNSPECIFIED) {
        btm_ble_cancel_remote_name(btm_cb.btm_inq_vars.remname_bda);
      }
      alarm_cancel(btm_cb.btm_inq_vars.remote_name_timer);
    btm_cb.btm_inq_vars.remname_active = false;
      /* Clean up and return the status if the command was not successful */
      /* Note: If part of the inquiry, the name is not stored, and the    */
      /*       inquiry complete callback is called.                       */
@@ -1973,20 +1971,33 @@ void btm_process_remote_name(const RawAddress* bda, const BD_NAME bdn,
        /* Note that even if it is not being returned, it is used as a  */
        /*      temporary buffer.                                       */
        rem_name.status = BTM_SUCCESS;
      rem_name.hci_status = hci_status;
        if (bdn) {
          bd_name_copy(rem_name.remote_bd_name, bdn);
        } else {
      /* If processing a stand alone remote name then report the error in the
         callback */
      rem_name.status = BTM_BAD_VALUE_RET;
      rem_name.hci_status = hci_status;
      rem_name.remote_bd_name[0] = 0;
          log::warn("Received null name from remote device bd_addr:{}",
                    rem_name.bd_addr.ToRedactedStringForLogging());
        }
      }
    /* Reset the remote BAD to zero and call callback if possible */
      /* Reset the remote BDA and call callback if possible */
      btm_cb.btm_inq_vars.remname_active = false;
      btm_cb.btm_inq_vars.remname_bda = RawAddress::kEmpty;

    btm_cb.btm_inq_vars.p_remname_cmpl_cb = NULL;
      tBTM_NAME_CMPL_CB* p_cb = btm_cb.btm_inq_vars.p_remname_cmpl_cb;
      btm_cb.btm_inq_vars.p_remname_cmpl_cb = nullptr;
      if (p_cb) (p_cb)(&rem_name);
    } else {
      log::warn("RNR received UNKNOWN name bd_addr:{} hci_status:{} le_link:{}",
                rem_name.bd_addr.ToRedactedStringForLogging(),
                hci_status_code_text(hci_status), logbool(on_le_link));
    }
  } else {
    log::info(
        "RNR received UNEXPECTED name bd_addr:{} inq_addr:{} hci_status:{} "
        "le_link:{} rnr_active:{}",
        rem_name.bd_addr.ToRedactedStringForLogging(),
        btm_cb.btm_inq_vars.remname_bda.ToRedactedStringForLogging(),
        hci_status_code_text(hci_status), logbool(on_le_link),
        logbool(btm_cb.btm_inq_vars.remname_active));
  }
}

+1 −1
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ TEST_F(BtmInqActiveTest, btm_process_remote_name__typical) {
  ASSERT_STREQ((char*)kBdName, (char*)gBTM_REMOTE_DEV_NAME.remote_bd_name);
}

TEST_F(BtmInqActiveTest, DISABLED_btm_process_remote_name__no_name) {
TEST_F(BtmInqActiveTest, btm_process_remote_name__no_name) {
  btm_process_remote_name(&kRawAddress, nullptr, 0, HCI_SUCCESS);
  ASSERT_FALSE(btm_cb.btm_inq_vars.p_remname_cmpl_cb);
  ASSERT_FALSE(btm_cb.btm_inq_vars.remname_active);