From 98b312a78b578d3d5425fc3bac0ca5ab14df5100 Mon Sep 17 00:00:00 2001 From: Shraddha Basantwani Date: Mon, 19 Feb 2024 09:39:01 +0000 Subject: [PATCH] Hdmi CEC Mock : Clear the existing callback when new callback is set Bug: 319140762 Test: ./android.hardware.tv.hdmi.cec-service_fuzzer Change-Id: If2aa563d66f49783d9534b2e6599e21abc11342f --- tv/hdmi/cec/aidl/default/HdmiCecMock.cpp | 32 ++++++++++++++---------- tv/hdmi/cec/aidl/default/HdmiCecMock.h | 4 +-- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/tv/hdmi/cec/aidl/default/HdmiCecMock.cpp b/tv/hdmi/cec/aidl/default/HdmiCecMock.cpp index 8a3c6f05c9..4dbd339706 100644 --- a/tv/hdmi/cec/aidl/default/HdmiCecMock.cpp +++ b/tv/hdmi/cec/aidl/default/HdmiCecMock.cpp @@ -35,8 +35,7 @@ namespace implementation { void HdmiCecMock::serviceDied(void* cookie) { ALOGE("HdmiCecMock died"); auto hdmiCecMock = static_cast(cookie); - hdmiCecMock->mCecThreadRun = false; - pthread_join(hdmiCecMock->mThreadId, NULL); + hdmiCecMock->closeCallback(); } ScopedAStatus HdmiCecMock::addLogicalAddress(CecLogicalAddress addr, Result* _aidl_return) { @@ -86,10 +85,10 @@ ScopedAStatus HdmiCecMock::sendMessage(const CecMessage& message, SendMessageRes } ScopedAStatus HdmiCecMock::setCallback(const std::shared_ptr& callback) { - // If callback is null, mCallback is also set to null so we do not call the old callback. - mCallback = callback; + closeCallback(); if (callback != nullptr) { + mCallback = callback; mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(AIBinder_DeathRecipient_new(serviceDied)); AIBinder_linkToDeath(callback->asBinder().get(), mDeathRecipient.get(), this /* cookie */); @@ -104,8 +103,8 @@ ScopedAStatus HdmiCecMock::setCallback(const std::shared_ptr& ScopedAStatus HdmiCecMock::setLanguage(const std::string& language) { if (language.size() != 3) { - LOG(ERROR) << "Wrong language code: expected 3 letters, but it was " << language.size() - << "."; + ALOGE("[halimp_aidl] Wrong language code: expected 3 letters, but it was %zu", + language.size()); return ScopedAStatus::ok(); } // TODO Validate if language is a valid language code @@ -169,7 +168,7 @@ int HdmiCecMock::sendMessageToFifo(const CecMessage& message) { // Open the output pipe for writing outgoing cec message mOutputFile = open(CEC_MSG_OUT_FIFO, O_WRONLY | O_CLOEXEC); if (mOutputFile < 0) { - ALOGD("[halimp_aidl] file open failed for writing"); + ALOGE("[halimp_aidl] file open failed for writing"); return -1; } @@ -258,17 +257,24 @@ void HdmiCecMock::threadLoop() { } HdmiCecMock::HdmiCecMock() { - ALOGE("[halimp_aidl] Opening a virtual CEC HAL for testing and virtual machine."); + ALOGD("[halimp_aidl] Opening a virtual CEC HAL for testing and virtual machine."); mCallback = nullptr; mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(nullptr); } +void HdmiCecMock::closeCallback() { + if (mCallback != nullptr) { + ALOGD("[halimp_aidl] HdmiCecMock close the current callback."); + mCallback = nullptr; + mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(nullptr); + mCecThreadRun = false; + pthread_join(mThreadId, NULL); + } +} + HdmiCecMock::~HdmiCecMock() { - ALOGE("[halimp_aidl] HdmiCecMock shutting down."); - mCallback = nullptr; - mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(nullptr); - mCecThreadRun = false; - pthread_join(mThreadId, NULL); + ALOGD("[halimp_aidl] HdmiCecMock shutting down."); + closeCallback(); } } // namespace implementation diff --git a/tv/hdmi/cec/aidl/default/HdmiCecMock.h b/tv/hdmi/cec/aidl/default/HdmiCecMock.h index e78b1cfae4..ef392bb899 100644 --- a/tv/hdmi/cec/aidl/default/HdmiCecMock.h +++ b/tv/hdmi/cec/aidl/default/HdmiCecMock.h @@ -55,6 +55,7 @@ struct HdmiCecMock : public BnHdmiCec { ::ndk::ScopedAStatus enableCec(bool value) override; ::ndk::ScopedAStatus enableSystemCecControl(bool value) override; void printCecMsgBuf(const char* msg_buf, int len); + void closeCallback(); private: static void* __threadLoop(void* data); @@ -62,9 +63,8 @@ struct HdmiCecMock : public BnHdmiCec { int readMessageFromFifo(unsigned char* buf, int msgCount); int sendMessageToFifo(const CecMessage& message); void handleCecMessage(unsigned char* msgBuf, int length); - - private: static void serviceDied(void* cookie); + std::shared_ptr mCallback; // Variables for the virtual cec hal impl