summaryrefslogtreecommitdiff
path: root/audio/2.0/default/StreamIn.cpp
diff options
context:
space:
mode:
authorKevin Rocard <krocard@google.com>2017-03-31 19:36:55 -0700
committerKevin Rocard <krocard@google.com>2017-04-07 14:35:47 -0700
commit40343061d5f6f309c68a54940e24d404e6cd620a (patch)
treee8accbddf32406584958b4013081e0de8fb1c459 /audio/2.0/default/StreamIn.cpp
parentb6498cbdf6c04c631ccf6a6e65a1264b455e3088 (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.cpp10
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,