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

Commit c5420857 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "HDMI Connection Fuzzer Fix" into main am: 3d3dab48

parents b97107ae 3d3dab48
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);