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

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

Change-Id: I83f806553354ba2fa99ba6008d0db3131e4fe334
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Treehugger Robot
2023-12-12 12:44:21 +00:00
committed by Automerger Merge Worker
2 changed files with 25 additions and 7 deletions

View File

@@ -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

View File

@@ -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);