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