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

This commit is contained in:
Nathalie Le Clair
2021-09-24 11:06:48 +00:00
committed by Android (Google) Code Review
5 changed files with 24 additions and 8 deletions

View File

@@ -254,7 +254,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) {
@@ -268,6 +268,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

@@ -1159,7 +1159,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);
@@ -1192,7 +1192,7 @@ public class HdmiControlService extends SystemService {
@Constants.HandleMessageResult
protected int 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.
@@ -3590,8 +3590,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

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

View File

@@ -649,6 +649,6 @@ public class HdmiCecMessageValidatorTest {
}
private IntegerSubject assertMessageValidity(String message) {
return assertThat(mHdmiCecMessageValidator.isValid(HdmiUtils.buildMessage(message)));
return assertThat(mHdmiCecMessageValidator.isValid(HdmiUtils.buildMessage(message), false));
}
}

View File

@@ -671,7 +671,7 @@ public class HdmiControlServiceTest {
@Test
public void handleCecCommand_errorParameter_returnsAbortInvalidOperand() {
// Validity ERROR_PARAMETER. Taken from HdmiCecMessageValidatorTest#isValid_menuStatus
HdmiCecMessage message = HdmiUtils.buildMessage("40:8D:03");
HdmiCecMessage message = HdmiUtils.buildMessage("80:8D:03");
assertThat(mHdmiControlServiceSpy.handleCecCommand(message))
.isEqualTo(Constants.ABORT_INVALID_OPERAND);