Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0a67fad authored by Sham Rathod's avatar Sham Rathod
Browse files

HDMI Connection Fuzzer Fix

Added explicit destructor to HdmiConnectionMock that stops the loop and
join the thread.

Bug: 300674264
Test: android.hardware.tv.hdmi.connection-service_fuzzer
Change-Id: I761ed4b8db5e5312535ecf99be3b490622bf0a8e
parent 577cc0ac
Loading
Loading
Loading
Loading
+23 −6
Original line number Diff line number Diff line
@@ -15,12 +15,11 @@
 */

#define LOG_TAG "android.hardware.tv.hdmi.connection"
#include "HdmiConnectionMock.h"
#include <android-base/logging.h>
#include <fcntl.h>
#include <utils/Log.h>

#include "HdmiConnectionMock.h"

using ndk::ScopedAStatus;

namespace android {
@@ -34,6 +33,7 @@ void HdmiConnectionMock::serviceDied(void* cookie) {
    ALOGE("HdmiConnectionMock died");
    auto hdmi = static_cast<HdmiConnectionMock*>(cookie);
    hdmi->mHdmiThreadRun = false;
    pthread_join(hdmi->mThreadId, NULL);
}

ScopedAStatus HdmiConnectionMock::getPortInfo(std::vector<HdmiPortInfo>* _aidl_return) {
@@ -55,12 +55,15 @@ ScopedAStatus HdmiConnectionMock::isConnected(int32_t portId, bool* _aidl_return
ScopedAStatus HdmiConnectionMock::setCallback(
        const std::shared_ptr<IHdmiConnectionCallback>& callback) {
    if (mCallback != nullptr) {
        stopThread();
        mCallback = nullptr;
    }

    if (callback != nullptr) {
        mCallback = callback;
        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(HDMI_MSG_IN_FIFO, O_RDWR | O_CLOEXEC);
        pthread_create(&mThreadId, NULL, __threadLoop, this);
@@ -153,7 +156,7 @@ void HdmiConnectionMock::threadLoop() {
    int r = -1;

    // Open the input pipe
    while (mInputFile < 0) {
    while (mHdmiThreadRun && mInputFile < 0) {
        usleep(1000 * 1000);
        mInputFile = open(HDMI_MSG_IN_FIFO, O_RDONLY | O_CLOEXEC);
    }
@@ -193,7 +196,21 @@ HdmiConnectionMock::HdmiConnectionMock() {
                     .physicalAddress = mPhysicalAddress};
    mPortConnectionStatus[0] = false;
    mHpdSignal[0] = HpdSignal::HDMI_HPD_PHYSICAL;
    mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(AIBinder_DeathRecipient_new(serviceDied));
    mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(nullptr);
}

void HdmiConnectionMock::stopThread() {
    if (mCallback != nullptr) {
        ALOGE("[halimp_aidl] HdmiConnectionMock shutting down.");
        mCallback = nullptr;
        mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(nullptr);
        mHdmiThreadRun = false;
        pthread_join(mThreadId, NULL);
    }
}

HdmiConnectionMock::~HdmiConnectionMock() {
    stopThread();
}

}  // namespace implementation
+2 −1
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ using ::aidl::android::hardware::tv::hdmi::connection::Result;

struct HdmiConnectionMock : public BnHdmiConnection {
    HdmiConnectionMock();

    ~HdmiConnectionMock();
    ::ndk::ScopedAStatus getPortInfo(std::vector<HdmiPortInfo>* _aidl_return) override;
    ::ndk::ScopedAStatus isConnected(int32_t portId, bool* _aidl_return) override;
    ::ndk::ScopedAStatus setCallback(
@@ -56,6 +56,7 @@ struct HdmiConnectionMock : public BnHdmiConnection {
    void threadLoop();
    int readMessageFromFifo(unsigned char* buf, int msgCount);
    void handleHotplugMessage(unsigned char* msgBuf);
    void stopThread();

  private:
    static void serviceDied(void* cookie);