Skip to content

Commit e295e58

Browse files
committed
fix use-after-free for sink/source metadata
This uses malloc/free to work around the existing code using a raw pointer to avoid invasive changes.
1 parent 323541f commit e295e58

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

system/bta/le_audio/audio_hal_client/audio_sink_hal_client.cc

+11-1
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,21 @@ bool SinkImpl::OnMetadataUpdateReq(const sink_metadata_v7_t& sink_metadata) {
162162
return false;
163163
}
164164

165+
sink_metadata_v7_t deep_copy;
166+
deep_copy.tracks = (struct record_track_metadata_v7*)malloc(sink_metadata.track_count * sizeof(deep_copy.tracks[0]));
167+
if (!deep_copy.tracks) {
168+
LOG_ERROR("malloc");
169+
return false;
170+
}
171+
memcpy(deep_copy.tracks, sink_metadata.tracks, sink_metadata.track_count * sizeof(deep_copy.tracks[0]));
172+
deep_copy.track_count = sink_metadata.track_count;
173+
165174
bt_status_t status = do_in_main_thread(
166175
FROM_HERE,
167176
base::BindOnce(
168177
&LeAudioSinkAudioHalClient::Callbacks::OnAudioMetadataUpdate,
169-
audioSinkCallbacks_->weak_factory_.GetWeakPtr(), sink_metadata));
178+
audioSinkCallbacks_->weak_factory_.GetWeakPtr(), deep_copy));
179+
do_in_main_thread(FROM_HERE, base::Bind(&free, (void*)deep_copy.tracks));
170180
if (status == BT_STATUS_SUCCESS) {
171181
return true;
172182
}

system/bta/le_audio/audio_hal_client/audio_source_hal_client.cc

+11-1
Original file line numberDiff line numberDiff line change
@@ -299,12 +299,22 @@ bool SourceImpl::OnMetadataUpdateReq(
299299
return false;
300300
}
301301

302+
source_metadata_v7_t deep_copy;
303+
deep_copy.tracks = (struct playback_track_metadata_v7*)malloc(source_metadata.track_count * sizeof(deep_copy.tracks[0]));
304+
if (!deep_copy.tracks) {
305+
LOG_ERROR("malloc");
306+
return false;
307+
}
308+
memcpy(deep_copy.tracks, source_metadata.tracks, source_metadata.track_count * sizeof(deep_copy.tracks[0]));
309+
deep_copy.track_count = source_metadata.track_count;
310+
302311
bt_status_t status = do_in_main_thread(
303312
FROM_HERE,
304313
base::BindOnce(
305314
&LeAudioSourceAudioHalClient::Callbacks::OnAudioMetadataUpdate,
306-
audioSourceCallbacks_->weak_factory_.GetWeakPtr(), source_metadata,
315+
audioSourceCallbacks_->weak_factory_.GetWeakPtr(), deep_copy,
307316
dsa_mode));
317+
do_in_main_thread(FROM_HERE, base::Bind(&free, (void *)deep_copy.tracks));
308318
if (status == BT_STATUS_SUCCESS) {
309319
return true;
310320
}

0 commit comments

Comments
 (0)