Merge "HDMI Connection Fuzzer Fix" into main

This commit is contained in:
Treehugger Robot 2023-12-12 12:20:20 +00:00 committed by Gerrit Code Review
commit 3d3dab4875
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);