Merge "HDMICEC: Add a new validation to CEC messages"

This commit is contained in:
Nathalie Le Clair
2021-09-27 13:33:00 +00:00
committed by Gerrit Code Review
4 changed files with 23 additions and 7 deletions

View File

@@ -242,7 +242,7 @@ public class HdmiCecMessageValidator {
mValidationInfo.append(opcode, new ValidationInfo(validator, addrType)); mValidationInfo.append(opcode, new ValidationInfo(validator, addrType));
} }
int isValid(HdmiCecMessage message) { int isValid(HdmiCecMessage message, boolean isMessageReceived) {
int opcode = message.getOpcode(); int opcode = message.getOpcode();
ValidationInfo info = mValidationInfo.get(opcode); ValidationInfo info = mValidationInfo.get(opcode);
if (info == null) { if (info == null) {
@@ -256,6 +256,22 @@ public class HdmiCecMessageValidator {
HdmiLogger.warning("Unexpected source: " + message); HdmiLogger.warning("Unexpected source: " + message);
return ERROR_SOURCE; return ERROR_SOURCE;
} }
if (isMessageReceived) {
// Check if the source's logical address and local device's logical
// address are the same.
for (HdmiCecLocalDevice device : mService.getAllLocalDevices()) {
synchronized (device.mLock) {
if (message.getSource() == device.getDeviceInfo().getLogicalAddress()
&& message.getSource() != Constants.ADDR_UNREGISTERED) {
HdmiLogger.warning(
"Unexpected source: message sent from device itself, " + message);
return ERROR_SOURCE;
}
}
}
}
// Check the destination field. // Check the destination field.
if (message.getDestination() == Constants.ADDR_BROADCAST) { if (message.getDestination() == Constants.ADDR_BROADCAST) {
if ((info.addressType & DEST_BROADCAST) == 0) { if ((info.addressType & DEST_BROADCAST) == 0) {

View File

@@ -1122,7 +1122,7 @@ public class HdmiControlService extends SystemService {
@ServiceThreadOnly @ServiceThreadOnly
void sendCecCommand(HdmiCecMessage command, @Nullable SendMessageCallback callback) { void sendCecCommand(HdmiCecMessage command, @Nullable SendMessageCallback callback) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (mMessageValidator.isValid(command) == HdmiCecMessageValidator.OK) { if (mMessageValidator.isValid(command, false) == HdmiCecMessageValidator.OK) {
mCecController.sendCommand(command, callback); mCecController.sendCommand(command, callback);
} else { } else {
HdmiLogger.error("Invalid message type:" + command); HdmiLogger.error("Invalid message type:" + command);
@@ -1153,7 +1153,7 @@ public class HdmiControlService extends SystemService {
@ServiceThreadOnly @ServiceThreadOnly
boolean handleCecCommand(HdmiCecMessage message) { boolean handleCecCommand(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int errorCode = mMessageValidator.isValid(message); int errorCode = mMessageValidator.isValid(message, true);
if (errorCode != HdmiCecMessageValidator.OK) { if (errorCode != HdmiCecMessageValidator.OK) {
// We'll not response on the messages with the invalid source or destination // We'll not response on the messages with the invalid source or destination
// or with parameter length shorter than specified in the standard. // or with parameter length shorter than specified in the standard.
@@ -3353,8 +3353,8 @@ public class HdmiControlService extends SystemService {
invokeInputChangeListener(info); invokeInputChangeListener(info);
} }
void setMhlInputChangeEnabled(boolean enabled) { void setMhlInputChangeEnabled(boolean enabled) {
mMhlController.setOption(OPTION_MHL_INPUT_SWITCHING, toInt(enabled)); mMhlController.setOption(OPTION_MHL_INPUT_SWITCHING, toInt(enabled));
synchronized (mLock) { synchronized (mLock) {
mMhlInputChangeEnabled = enabled; mMhlInputChangeEnabled = enabled;

View File

@@ -125,7 +125,7 @@ public class HdmiCecLocalDeviceTest {
mMessageValidator = mMessageValidator =
new HdmiCecMessageValidator(mHdmiControlService) { new HdmiCecMessageValidator(mHdmiControlService) {
@Override @Override
int isValid(HdmiCecMessage message) { int isValid(HdmiCecMessage message, boolean isMessageReceived) {
return HdmiCecMessageValidator.OK; return HdmiCecMessageValidator.OK;
} }
}; };

View File

@@ -629,7 +629,7 @@ public class HdmiCecMessageValidatorTest {
} }
private IntegerSubject assertMessageValidity(String message) { private IntegerSubject assertMessageValidity(String message) {
return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message))); return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message), false));
} }
/** /**