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

Commit 99b56dd1 authored by Can Chen's avatar Can Chen Committed by 陈璨
Browse files

Fix avrcp memleak in attr_response handler function

[Root Cause]
These is a memleak for element attributes response

[Solution]
Add memory free

Bug: 263864734
Test: atest net_test_btif_rc pass

Change-Id: I2b174647fef6f6b117fb0e1c0f2415581de67289
parent f7a75b6d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -3957,6 +3957,9 @@ static void handle_get_metadata_attr_response(tBTA_AV_META_MSG* pmeta_msg,
        osi_free_and_reset((void**)&p_rsp->p_attrs[i].name.p_str);
      }
    }

    osi_free_and_reset((void**)&p_rsp->p_attrs);

    do_in_jni_thread(FROM_HERE,
                     base::Bind(bt_rc_ctrl_callbacks->track_changed_cb,
                                p_dev->rc_addr, p_rsp->num_attrs, p_attr));
+39 −0
Original line number Diff line number Diff line
@@ -426,3 +426,42 @@ TEST_F(BtifRcConnectionTest, BTA_AV_RC_OPEN_EVT) {
  auto res = future.get();
  CHECK(res.rc_state == true);
}

class BtifTrackChangeCBTest : public BtifRcTest {
 protected:
  void SetUp() override {
    BtifRcTest::SetUp();
    init_ctrl(&btrc_ctrl_callbacks);
    jni_thread.StartUp();
    btrc_ctrl_callbacks.track_changed_cb = [](const RawAddress& bd_addr,
                       uint8_t num_attr, btrc_element_attr_val_t* p_attrs) {
      btif_rc_cb.rc_multi_cb[0].rc_addr = bd_addr;
    };
  }

  void TearDown() override {
    btrc_ctrl_callbacks.track_changed_cb = [](const RawAddress& bd_addr,
                       uint8_t num_attr, btrc_element_attr_val_t* p_attrs) {};
    BtifRcTest::TearDown();
  }
};

TEST_F(BtifTrackChangeCBTest, handle_get_metadata_attr_response) {
  tBTA_AV_META_MSG meta_msg = {
    .rc_handle = 0,
  };

  tAVRC_GET_ATTRS_RSP rsp = {
    .status = AVRC_STS_NO_ERROR,
    .num_attrs = 0,
  };

  btif_rc_cb.rc_multi_cb[0].rc_handle = 0;
  btif_rc_cb.rc_multi_cb[0].rc_addr = RawAddress::kEmpty;
  btif_rc_cb.rc_multi_cb[0].rc_state = BTRC_CONNECTION_STATE_CONNECTED;
  btif_rc_cb.rc_multi_cb[0].rc_connected = true;

  handle_get_metadata_attr_response(&meta_msg, &rsp);

  ASSERT_EQ(1, get_func_call_count("osi_free_and_reset"));
}