Merge "HDMICEC: Add a new validation to CEC messages"
This commit is contained in:
commit
662af62f16
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user