diff options
author | Praveen Chavan <pchavan@codeaurora.org> | 2015-09-29 02:25:47 -0700 |
---|---|---|
committer | Glenn Kasten <gkasten@google.com> | 2015-10-05 09:13:59 -0700 |
commit | 4802c0c507681634aee38518581a080bfa443ae2 (patch) | |
tree | e184ee110c468c7ef4621e5e32a6b8bfeaab11d6 /media/libmedia | |
parent | 4a8f4a3f567d8b3134b1c7ab21ca774f279ab9c2 (diff) | |
download | frameworks_av-4802c0c507681634aee38518581a080bfa443ae2.zip frameworks_av-4802c0c507681634aee38518581a080bfa443ae2.tar.gz frameworks_av-4802c0c507681634aee38518581a080bfa443ae2.tar.bz2 |
AudioSystem: Fix race condition in accessing ioDescriptors
The vector mIoDescriptors can be simultaneouly modified
and accessed by 2 threads. Acquire a lock while wrapping
the ioDescriptor in a sp<>
Bug: 24576810
Author: Haynes Mathew George <hgeorge@codeaurora.org>
Change-Id: I73c79ef8eca092b500a7ead3a5ebd0bcf75f9920
Diffstat (limited to 'media/libmedia')
-rw-r--r-- | media/libmedia/AudioSystem.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp index 3bfb09a..9d645f0 100644 --- a/media/libmedia/AudioSystem.cpp +++ b/media/libmedia/AudioSystem.cpp @@ -476,7 +476,7 @@ void AudioSystem::AudioFlingerClient::ioConfigChanged(audio_io_config_event even switch (event) { case AUDIO_OUTPUT_OPENED: case AUDIO_INPUT_OPENED: { - sp<AudioIoDescriptor> oldDesc = getIoDescriptor(ioDesc->mIoHandle); + sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle); if (oldDesc == 0) { mIoDescriptors.add(ioDesc->mIoHandle, ioDesc); } else { @@ -498,7 +498,7 @@ void AudioSystem::AudioFlingerClient::ioConfigChanged(audio_io_config_event even } break; case AUDIO_OUTPUT_CLOSED: case AUDIO_INPUT_CLOSED: { - if (getIoDescriptor(ioDesc->mIoHandle) == 0) { + if (getIoDescriptor_l(ioDesc->mIoHandle) == 0) { ALOGW("ioConfigChanged() closing unknown %s %d", event == AUDIO_OUTPUT_CLOSED ? "output" : "input", ioDesc->mIoHandle); break; @@ -512,7 +512,7 @@ void AudioSystem::AudioFlingerClient::ioConfigChanged(audio_io_config_event even case AUDIO_OUTPUT_CONFIG_CHANGED: case AUDIO_INPUT_CONFIG_CHANGED: { - sp<AudioIoDescriptor> oldDesc = getIoDescriptor(ioDesc->mIoHandle); + sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle); if (oldDesc == 0) { ALOGW("ioConfigChanged() modifying unknown output! %d", ioDesc->mIoHandle); break; @@ -575,7 +575,7 @@ status_t AudioSystem::AudioFlingerClient::getInputBufferSize( return NO_ERROR; } -sp<AudioIoDescriptor> AudioSystem::AudioFlingerClient::getIoDescriptor(audio_io_handle_t ioHandle) +sp<AudioIoDescriptor> AudioSystem::AudioFlingerClient::getIoDescriptor_l(audio_io_handle_t ioHandle) { sp<AudioIoDescriptor> desc; ssize_t index = mIoDescriptors.indexOfKey(ioHandle); @@ -585,6 +585,12 @@ sp<AudioIoDescriptor> AudioSystem::AudioFlingerClient::getIoDescriptor(audio_io_ return desc; } +sp<AudioIoDescriptor> AudioSystem::AudioFlingerClient::getIoDescriptor(audio_io_handle_t ioHandle) +{ + Mutex::Autolock _l(mLock); + return getIoDescriptor_l(ioHandle); +} + status_t AudioSystem::AudioFlingerClient::addAudioDeviceCallback( const sp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo) { |