diff options
author | Kevin Rocard <krocard@google.com> | 2017-03-31 19:36:55 -0700 |
---|---|---|
committer | Kevin Rocard <krocard@google.com> | 2017-04-07 14:35:47 -0700 |
commit | 40343061d5f6f309c68a54940e24d404e6cd620a (patch) | |
tree | e8accbddf32406584958b4013081e0de8fb1c459 /audio/2.0/default/StreamIn.cpp | |
parent | b6498cbdf6c04c631ccf6a6e65a1264b455e3088 (diff) |
Audio HAL: Destroy EventFlag on failed prepareTo{write,read}
If prepareToWrite or prepareToRead fails after EventFlag is created, it
is not destroyed. This lead to strange random crashes (double free it seems).
Use the RAII pattern to manage the EventFlag life cycle.
Test: Run test on target
Bug: 36311550
Change-Id: I53a04a62b7d12fdcc94afd8ced3e547aa6edff50
Signed-off-by: Kevin Rocard <krocard@google.com>
Diffstat (limited to 'audio/2.0/default/StreamIn.cpp')
-rw-r--r-- | audio/2.0/default/StreamIn.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/audio/2.0/default/StreamIn.cpp b/audio/2.0/default/StreamIn.cpp index 4b7915117e..0798bbea9d 100644 --- a/audio/2.0/default/StreamIn.cpp +++ b/audio/2.0/default/StreamIn.cpp @@ -330,8 +330,11 @@ Return<void> StreamIn::prepareForReading( CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } - status = EventFlag::createEventFlag(tempDataMQ->getEventFlagWord(), &mEfGroup); - if (status != OK || !mEfGroup) { + EventFlag* tempRawEfGroup{}; + status = EventFlag::createEventFlag(tempDataMQ->getEventFlagWord(), &tempRawEfGroup); + std::unique_ptr<EventFlag, void(*)(EventFlag*)> tempElfGroup(tempRawEfGroup, [](auto *ef) { + EventFlag::deleteEventFlag(&ef); }); + if (status != OK || !tempElfGroup) { ALOGE("failed creating event flag for data MQ: %s", strerror(-status)); _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); @@ -345,7 +348,7 @@ Return<void> StreamIn::prepareForReading( tempCommandMQ.get(), tempDataMQ.get(), tempStatusMQ.get(), - mEfGroup); + tempElfGroup.get()); if (!tempReadThread->init()) { _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); @@ -363,6 +366,7 @@ Return<void> StreamIn::prepareForReading( mDataMQ = std::move(tempDataMQ); mStatusMQ = std::move(tempStatusMQ); mReadThread = tempReadThread.release(); + mEfGroup = tempElfGroup.release(); threadInfo.pid = getpid(); threadInfo.tid = mReadThread->getTid(); _hidl_cb(Result::OK, |