Merge "HDMICEC: Add a new validation to CEC messages"
This commit is contained in:
committed by
Android (Google) Code Review
commit
ce9221ad0b
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user