From e017878151be5808b64115e6d45500a0236ef168 Mon Sep 17 00:00:00 2001 From: Venkatarama Avadhani Date: Mon, 11 Sep 2023 09:03:18 +0530 Subject: [PATCH] CEC Fuzzer Fix Ensure that the mock CEC exits cleanly when the service that created it dies. Bug: 293249165 Test: android.hardware.tv.hdmi.cec-service_fuzzer Change-Id: Ic7b69ddb10414cbdf6570056144b8013f497e7dc --- tv/hdmi/cec/aidl/default/HdmiCecMock.cpp | 17 ++++++++++++++--- tv/hdmi/cec/aidl/default/HdmiCecMock.h | 1 + 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/tv/hdmi/cec/aidl/default/HdmiCecMock.cpp b/tv/hdmi/cec/aidl/default/HdmiCecMock.cpp index 0212e7e729..8a3c6f05c9 100644 --- a/tv/hdmi/cec/aidl/default/HdmiCecMock.cpp +++ b/tv/hdmi/cec/aidl/default/HdmiCecMock.cpp @@ -36,6 +36,7 @@ void HdmiCecMock::serviceDied(void* cookie) { ALOGE("HdmiCecMock died"); auto hdmiCecMock = static_cast(cookie); hdmiCecMock->mCecThreadRun = false; + pthread_join(hdmiCecMock->mThreadId, NULL); } ScopedAStatus HdmiCecMock::addLogicalAddress(CecLogicalAddress addr, Result* _aidl_return) { @@ -89,7 +90,9 @@ ScopedAStatus HdmiCecMock::setCallback(const std::shared_ptr& mCallback = callback; if (callback != nullptr) { - AIBinder_linkToDeath(this->asBinder().get(), mDeathRecipient.get(), 0 /* cookie */); + mDeathRecipient = + ndk::ScopedAIBinder_DeathRecipient(AIBinder_DeathRecipient_new(serviceDied)); + AIBinder_linkToDeath(callback->asBinder().get(), mDeathRecipient.get(), this /* cookie */); mInputFile = open(CEC_MSG_IN_FIFO, O_RDWR | O_CLOEXEC); mOutputFile = open(CEC_MSG_OUT_FIFO, O_RDWR | O_CLOEXEC); @@ -220,7 +223,7 @@ void HdmiCecMock::threadLoop() { int r = -1; // Open the input pipe - while (mInputFile < 0) { + while (mCecThreadRun && mInputFile < 0) { usleep(1000 * 1000); mInputFile = open(CEC_MSG_IN_FIFO, O_RDONLY | O_CLOEXEC); } @@ -257,7 +260,15 @@ void HdmiCecMock::threadLoop() { HdmiCecMock::HdmiCecMock() { ALOGE("[halimp_aidl] Opening a virtual CEC HAL for testing and virtual machine."); mCallback = nullptr; - mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(AIBinder_DeathRecipient_new(serviceDied)); + mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(nullptr); +} + +HdmiCecMock::~HdmiCecMock() { + ALOGE("[halimp_aidl] HdmiCecMock shutting down."); + mCallback = nullptr; + mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(nullptr); + mCecThreadRun = false; + pthread_join(mThreadId, NULL); } } // namespace implementation diff --git a/tv/hdmi/cec/aidl/default/HdmiCecMock.h b/tv/hdmi/cec/aidl/default/HdmiCecMock.h index aca0581233..e78b1cfae4 100644 --- a/tv/hdmi/cec/aidl/default/HdmiCecMock.h +++ b/tv/hdmi/cec/aidl/default/HdmiCecMock.h @@ -40,6 +40,7 @@ using ::aidl::android::hardware::tv::hdmi::cec::SendMessageResult; struct HdmiCecMock : public BnHdmiCec { HdmiCecMock(); + ~HdmiCecMock(); ::ndk::ScopedAStatus addLogicalAddress(CecLogicalAddress addr, Result* _aidl_return) override; ::ndk::ScopedAStatus clearLogicalAddress() override; ::ndk::ScopedAStatus enableAudioReturnChannel(int32_t portId, bool enable) override;