Merge "audio: Fix handling of a thread exit command with a bad cookie" into main am: 759fb98667

Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/2908743

Change-Id: Ib53b2daa933ae42bd64b49e139e9a3ce2057162c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Treehugger Robot
2024-01-13 01:35:34 +00:00
committed by Automerger Merge Worker
2 changed files with 19 additions and 13 deletions

View File

@@ -180,17 +180,20 @@ StreamInWorkerLogic::Status StreamInWorkerLogic::cycle() {
StreamDescriptor::Reply reply{}; StreamDescriptor::Reply reply{};
reply.status = STATUS_BAD_VALUE; reply.status = STATUS_BAD_VALUE;
switch (command.getTag()) { switch (command.getTag()) {
case Tag::halReservedExit: case Tag::halReservedExit: {
if (const int32_t cookie = command.get<Tag::halReservedExit>(); const int32_t cookie = command.get<Tag::halReservedExit>();
cookie == (mContext->getInternalCommandCookie() ^ getTid())) { if (cookie == (mContext->getInternalCommandCookie() ^ getTid())) {
mDriver->shutdown(); mDriver->shutdown();
setClosed(); setClosed();
// This is an internal command, no need to reply.
return Status::EXIT;
} else { } else {
LOG(WARNING) << __func__ << ": EXIT command has a bad cookie: " << cookie; LOG(WARNING) << __func__ << ": EXIT command has a bad cookie: " << cookie;
} }
break; if (cookie != 0) { // This is an internal command, no need to reply.
return Status::EXIT;
} else {
break;
}
}
case Tag::getStatus: case Tag::getStatus:
populateReply(&reply, mIsConnected); populateReply(&reply, mIsConnected);
break; break;
@@ -400,17 +403,20 @@ StreamOutWorkerLogic::Status StreamOutWorkerLogic::cycle() {
reply.status = STATUS_BAD_VALUE; reply.status = STATUS_BAD_VALUE;
using Tag = StreamDescriptor::Command::Tag; using Tag = StreamDescriptor::Command::Tag;
switch (command.getTag()) { switch (command.getTag()) {
case Tag::halReservedExit: case Tag::halReservedExit: {
if (const int32_t cookie = command.get<Tag::halReservedExit>(); const int32_t cookie = command.get<Tag::halReservedExit>();
cookie == (mContext->getInternalCommandCookie() ^ getTid())) { if (cookie == (mContext->getInternalCommandCookie() ^ getTid())) {
mDriver->shutdown(); mDriver->shutdown();
setClosed(); setClosed();
// This is an internal command, no need to reply.
return Status::EXIT;
} else { } else {
LOG(WARNING) << __func__ << ": EXIT command has a bad cookie: " << cookie; LOG(WARNING) << __func__ << ": EXIT command has a bad cookie: " << cookie;
} }
break; if (cookie != 0) { // This is an internal command, no need to reply.
return Status::EXIT;
} else {
break;
}
}
case Tag::getStatus: case Tag::getStatus:
populateReply(&reply, mIsConnected); populateReply(&reply, mIsConnected);
break; break;

View File

@@ -90,7 +90,7 @@ class StreamContext {
std::weak_ptr<sounddose::StreamDataProcessorInterface> streamDataProcessor, std::weak_ptr<sounddose::StreamDataProcessorInterface> streamDataProcessor,
DebugParameters debugParameters) DebugParameters debugParameters)
: mCommandMQ(std::move(commandMQ)), : mCommandMQ(std::move(commandMQ)),
mInternalCommandCookie(std::rand()), mInternalCommandCookie(std::rand() | 1 /* make sure it's not 0 */),
mReplyMQ(std::move(replyMQ)), mReplyMQ(std::move(replyMQ)),
mFormat(format), mFormat(format),
mChannelLayout(channelLayout), mChannelLayout(channelLayout),