From 0a7c0ae9c12f67594107194d61ad0b175a226e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Wed, 11 Nov 2020 14:49:41 -0500 Subject: [PATCH] android: avoid use-after-free in OpenSL Change-Id: I5fe40e7bccd74a2aa1de5427c21d09b77946e4a2 --- src/media/audio/opensl/audio_player.cpp | 4 +++- src/media/audio/opensl/audio_recorder.cpp | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/media/audio/opensl/audio_player.cpp b/src/media/audio/opensl/audio_player.cpp index 6de31b0711..4946290eac 100644 --- a/src/media/audio/opensl/audio_player.cpp +++ b/src/media/audio/opensl/audio_player.cpp @@ -67,7 +67,8 @@ AudioPlayer::processSLCallback(SLAndroidSimpleBufferQueueItf bq) } } - callback_(); + if (callback_) + callback_(); while (playQueue_->front(&buf) && devShadowQueue_.push(buf)) { if ((*bq)->Enqueue(bq, buf->buf_, buf->size_) != SL_RESULT_SUCCESS) { @@ -230,6 +231,7 @@ AudioPlayer::stop() { JAMI_DBG("OpenSL playback stop"); std::lock_guard<std::mutex> lk(m_); + callback_ = {}; SLuint32 state; SLresult result = (*playItf_)->GetPlayState(playItf_, &state); diff --git a/src/media/audio/opensl/audio_recorder.cpp b/src/media/audio/opensl/audio_recorder.cpp index 97d0416a25..3f00df441f 100644 --- a/src/media/audio/opensl/audio_recorder.cpp +++ b/src/media/audio/opensl/audio_recorder.cpp @@ -54,7 +54,8 @@ AudioRecorder::processSLCallback(SLAndroidSimpleBufferQueueItf bq) /*if (devShadowQueue_.size() == 0) { (*recItf_)->SetRecordState(recItf_, SL_RECORDSTATE_STOPPED); }*/ - callback_(); + if (callback_) + callback_(); } catch (const std::exception& e) { JAMI_ERR("processSLCallback exception: %s", e.what()); } @@ -250,6 +251,8 @@ AudioRecorder::stop() result = (*recItf_)->SetRecordState(recItf_, SL_RECORDSTATE_STOPPED); SLASSERT(result); + callback_ = {}; + result = (*recBufQueueItf_)->Clear(recBufQueueItf_); SLASSERT(result); -- GitLab