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

Commit c8a5763f authored by Łukasz Rymanowski's avatar Łukasz Rymanowski Committed by Jack He
Browse files

leaudio: Fix crash on metadata update

When moving metadata to Bluetooth mainthread, make sure that Bluetooth
gets metadata and not just a pointer to memory on the stack.

`sink_metadata_v7` contained a pointer to array of either (record|playback)_track_metadata_v7,
so we can't rely on simple struct copy constructor. Pass the array content as vector instead.

Bug: 329067188
Test: mmm packages/modules/Bluetooth
Test: manual LeAudio streaming with different contexs (including call)
Test: atest bluetooth_le_audio_client_test
Ignore-AOSP-First: security
Change-Id: I9c01c81c0094df87efc1b3885ad69d82b0970404
parent 97c756aa
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -104,7 +104,8 @@ class LeAudioSinkAudioHalClient {
    virtual ~Callbacks() = default;
    virtual void OnAudioSuspend(void) = 0;
    virtual void OnAudioResume(void) = 0;
    virtual void OnAudioMetadataUpdate(sink_metadata_v7 sink_metadata) = 0;
    virtual void OnAudioMetadataUpdate(
        const std::vector<struct record_track_metadata_v7> sink_metadata) = 0;

    base::WeakPtrFactory<Callbacks> weak_factory_{this};
  };
@@ -144,7 +145,8 @@ class LeAudioSourceAudioHalClient {
    virtual void OnAudioDataReady(const std::vector<uint8_t>& data) = 0;
    virtual void OnAudioSuspend(void) = 0;
    virtual void OnAudioResume(void) = 0;
    virtual void OnAudioMetadataUpdate(source_metadata_v7 source_metadata,
    virtual void OnAudioMetadataUpdate(
        const std::vector<struct playback_track_metadata_v7> source_metadata,
        DsaMode dsa_mode) = 0;

    base::WeakPtrFactory<Callbacks> weak_factory_{this};
+9 −5
Original line number Diff line number Diff line
@@ -220,8 +220,10 @@ class MockLeAudioClientAudioSinkEventReceiver
              (override));
  MOCK_METHOD((void), OnAudioSuspend, (), (override));
  MOCK_METHOD((void), OnAudioResume, (), (override));
  MOCK_METHOD((void), OnAudioMetadataUpdate,
              (source_metadata_v7 source_metadata, DsaMode dsa_mode),
  MOCK_METHOD(
      (void), OnAudioMetadataUpdate,
      (const std::vector<struct playback_track_metadata_v7> source_metadata,
       DsaMode dsa_mode),
      (override));
};

@@ -230,7 +232,9 @@ class MockAudioHalClientEventReceiver
 public:
  MOCK_METHOD((void), OnAudioSuspend, (), (override));
  MOCK_METHOD((void), OnAudioResume, (), (override));
  MOCK_METHOD((void), OnAudioMetadataUpdate, (sink_metadata_v7 sink_metadata),
  MOCK_METHOD(
      (void), OnAudioMetadataUpdate,
      (const std::vector<struct record_track_metadata_v7> sink_metadata),
      (override));
};

+5 −1
Original line number Diff line number Diff line
@@ -162,11 +162,15 @@ bool SinkImpl::OnMetadataUpdateReq(const sink_metadata_v7_t& sink_metadata) {
    return false;
  }

  std::vector<struct record_track_metadata_v7> metadata(
      sink_metadata.tracks, sink_metadata.tracks + sink_metadata.track_count);

  bt_status_t status = do_in_main_thread(
      FROM_HERE,
      base::BindOnce(
          &LeAudioSinkAudioHalClient::Callbacks::OnAudioMetadataUpdate,
          audioSinkCallbacks_->weak_factory_.GetWeakPtr(), sink_metadata));
          audioSinkCallbacks_->weak_factory_.GetWeakPtr(),
          std::move(metadata)));
  if (status == BT_STATUS_SUCCESS) {
    return true;
  }
+6 −2
Original line number Diff line number Diff line
@@ -304,12 +304,16 @@ bool SourceImpl::OnMetadataUpdateReq(
    return false;
  }

  std::vector<struct playback_track_metadata_v7> metadata(
      source_metadata.tracks,
      source_metadata.tracks + source_metadata.track_count);

  bt_status_t status = do_in_main_thread(
      FROM_HERE,
      base::BindOnce(
          &LeAudioSourceAudioHalClient::Callbacks::OnAudioMetadataUpdate,
          audioSourceCallbacks_->weak_factory_.GetWeakPtr(), source_metadata,
          dsa_mode));
          audioSourceCallbacks_->weak_factory_.GetWeakPtr(),
          std::move(metadata), dsa_mode));
  if (status == BT_STATUS_SUCCESS) {
    return true;
  }
+3 −2
Original line number Diff line number Diff line
@@ -1135,7 +1135,8 @@ class LeAudioBroadcasterImpl : public LeAudioBroadcaster, public BigCallbacks {
      instance->le_audio_source_hal_client_->ConfirmStreamingRequest();
    }

    virtual void OnAudioMetadataUpdate(source_metadata_v7 source_metadata,
    virtual void OnAudioMetadataUpdate(
        const std::vector<struct playback_track_metadata_v7> source_metadata,
        DsaMode dsa_mode) override {
      LOG_INFO();
      if (!instance) return;
Loading