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
commit 662af62f16
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));
}
int isValid(HdmiCecMessage message) {
int isValid(HdmiCecMessage message, boolean isMessageReceived) {
int opcode = message.getOpcode();
ValidationInfo info = mValidationInfo.get(opcode);
if (info == null) {
@ -256,6 +256,22 @@ public class HdmiCecMessageValidator {
HdmiLogger.warning("Unexpected source: " + message);
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.
if (message.getDestination() == Constants.ADDR_BROADCAST) {
if ((info.addressType & DEST_BROADCAST) == 0) {

View File

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

View File

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

View File

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