Loading services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java +38 −7 Original line number Diff line number Diff line Loading @@ -152,8 +152,10 @@ public class HdmiCecMessageValidator { addValidationInfo(Constants.MESSAGE_SET_OSD_NAME, new AsciiValidator(1, 14), DEST_DIRECT); // Messages for the Device Menu Control. addValidationInfo(Constants.MESSAGE_MENU_REQUEST, oneByteValidator, DEST_DIRECT); addValidationInfo(Constants.MESSAGE_MENU_STATUS, oneByteValidator, DEST_DIRECT); addValidationInfo( Constants.MESSAGE_MENU_REQUEST, new OneByteRangeValidator(0x00, 0x02), DEST_DIRECT); addValidationInfo( Constants.MESSAGE_MENU_STATUS, new OneByteRangeValidator(0x00, 0x01), DEST_DIRECT); // Messages for the Remote Control Passthrough. // TODO: Parse the first parameter and determine if it can have the next parameter. Loading @@ -161,7 +163,10 @@ public class HdmiCecMessageValidator { new VariableLengthValidator(1, 2), DEST_DIRECT); // Messages for the Power Status. addValidationInfo(Constants.MESSAGE_REPORT_POWER_STATUS, oneByteValidator, DEST_DIRECT); addValidationInfo( Constants.MESSAGE_REPORT_POWER_STATUS, new OneByteRangeValidator(0x00, 0x03), DEST_DIRECT); // Messages for the General Protocol. addValidationInfo(Constants.MESSAGE_FEATURE_ABORT, Loading @@ -173,12 +178,20 @@ public class HdmiCecMessageValidator { new FixedLengthValidator(3), DEST_DIRECT); addValidationInfo(Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR, oneByteValidator, DEST_DIRECT); addValidationInfo(Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE, oneByteValidator, DEST_ALL); addValidationInfo(Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS, oneByteValidator, DEST_DIRECT); addValidationInfo( Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE, new OneByteRangeValidator(0x00, 0x01), DEST_ALL); addValidationInfo( Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS, new OneByteRangeValidator(0x00, 0x01), DEST_DIRECT); // Messages for the Audio Rate Control. addValidationInfo(Constants.MESSAGE_SET_AUDIO_RATE, oneByteValidator, DEST_DIRECT); addValidationInfo( Constants.MESSAGE_SET_AUDIO_RATE, new OneByteRangeValidator(0x00, 0x06), DEST_DIRECT); // All Messages for the ARC have no parameters. Loading Loading @@ -441,4 +454,22 @@ public class HdmiCecMessageValidator { && isValidAsciiString(params, 1, 14)); } } /** Check if the given parameters are one byte parameters and within range. */ private class OneByteRangeValidator implements ParameterValidator { private final int mMinValue, mMaxValue; OneByteRangeValidator(int minValue, int maxValue) { mMinValue = minValue; mMaxValue = maxValue; } @Override public int isValid(byte[] params) { if (params.length < 1) { return ERROR_PARAMETER_SHORT; } return toErrorCode(isWithinRange(params[0], mMinValue, mMaxValue)); } } } services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java +57 −0 Original line number Diff line number Diff line Loading @@ -66,10 +66,67 @@ public class HdmiCecMessageValidatorTest { @Test public void isValid_reportPowerStatus() { assertMessageValidity("04:90:00").isEqualTo(OK); assertMessageValidity("04:90:03:05").isEqualTo(OK); assertMessageValidity("0F:90:00").isEqualTo(ERROR_DESTINATION); assertMessageValidity("F0:90").isEqualTo(ERROR_SOURCE); assertMessageValidity("04:90").isEqualTo(ERROR_PARAMETER_SHORT); assertMessageValidity("04:90:04").isEqualTo(ERROR_PARAMETER); } @Test public void isValid_menuRequest() { assertMessageValidity("40:8D:00").isEqualTo(OK); assertMessageValidity("40:8D:02:04").isEqualTo(OK); assertMessageValidity("0F:8D:00").isEqualTo(ERROR_DESTINATION); assertMessageValidity("F0:8D").isEqualTo(ERROR_SOURCE); assertMessageValidity("40:8D").isEqualTo(ERROR_PARAMETER_SHORT); assertMessageValidity("40:8D:03").isEqualTo(ERROR_PARAMETER); } @Test public void isValid_menuStatus() { assertMessageValidity("40:8E:00").isEqualTo(OK); assertMessageValidity("40:8E:01:00").isEqualTo(OK); assertMessageValidity("0F:8E:00").isEqualTo(ERROR_DESTINATION); assertMessageValidity("F0:8E").isEqualTo(ERROR_SOURCE); assertMessageValidity("40:8E").isEqualTo(ERROR_PARAMETER_SHORT); assertMessageValidity("40:8E:02").isEqualTo(ERROR_PARAMETER); } @Test public void isValid_setSystemAudioMode() { assertMessageValidity("40:72:00").isEqualTo(OK); assertMessageValidity("4F:72:01:03").isEqualTo(OK); assertMessageValidity("F0:72").isEqualTo(ERROR_SOURCE); assertMessageValidity("40:72").isEqualTo(ERROR_PARAMETER_SHORT); assertMessageValidity("40:72:02").isEqualTo(ERROR_PARAMETER); } @Test public void isValid_systemAudioModeStatus() { assertMessageValidity("40:7E:00").isEqualTo(OK); assertMessageValidity("40:7E:01:01").isEqualTo(OK); assertMessageValidity("0F:7E:00").isEqualTo(ERROR_DESTINATION); assertMessageValidity("F0:7E").isEqualTo(ERROR_SOURCE); assertMessageValidity("40:7E").isEqualTo(ERROR_PARAMETER_SHORT); assertMessageValidity("40:7E:02").isEqualTo(ERROR_PARAMETER); } @Test public void isValid_setAudioRate() { assertMessageValidity("40:9A:00").isEqualTo(OK); assertMessageValidity("40:9A:03").isEqualTo(OK); assertMessageValidity("40:9A:06:02").isEqualTo(OK); assertMessageValidity("0F:9A:00").isEqualTo(ERROR_DESTINATION); assertMessageValidity("F0:9A").isEqualTo(ERROR_SOURCE); assertMessageValidity("40:9A").isEqualTo(ERROR_PARAMETER_SHORT); assertMessageValidity("40:9A:07").isEqualTo(ERROR_PARAMETER); } @Test Loading Loading
services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java +38 −7 Original line number Diff line number Diff line Loading @@ -152,8 +152,10 @@ public class HdmiCecMessageValidator { addValidationInfo(Constants.MESSAGE_SET_OSD_NAME, new AsciiValidator(1, 14), DEST_DIRECT); // Messages for the Device Menu Control. addValidationInfo(Constants.MESSAGE_MENU_REQUEST, oneByteValidator, DEST_DIRECT); addValidationInfo(Constants.MESSAGE_MENU_STATUS, oneByteValidator, DEST_DIRECT); addValidationInfo( Constants.MESSAGE_MENU_REQUEST, new OneByteRangeValidator(0x00, 0x02), DEST_DIRECT); addValidationInfo( Constants.MESSAGE_MENU_STATUS, new OneByteRangeValidator(0x00, 0x01), DEST_DIRECT); // Messages for the Remote Control Passthrough. // TODO: Parse the first parameter and determine if it can have the next parameter. Loading @@ -161,7 +163,10 @@ public class HdmiCecMessageValidator { new VariableLengthValidator(1, 2), DEST_DIRECT); // Messages for the Power Status. addValidationInfo(Constants.MESSAGE_REPORT_POWER_STATUS, oneByteValidator, DEST_DIRECT); addValidationInfo( Constants.MESSAGE_REPORT_POWER_STATUS, new OneByteRangeValidator(0x00, 0x03), DEST_DIRECT); // Messages for the General Protocol. addValidationInfo(Constants.MESSAGE_FEATURE_ABORT, Loading @@ -173,12 +178,20 @@ public class HdmiCecMessageValidator { new FixedLengthValidator(3), DEST_DIRECT); addValidationInfo(Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR, oneByteValidator, DEST_DIRECT); addValidationInfo(Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE, oneByteValidator, DEST_ALL); addValidationInfo(Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS, oneByteValidator, DEST_DIRECT); addValidationInfo( Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE, new OneByteRangeValidator(0x00, 0x01), DEST_ALL); addValidationInfo( Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS, new OneByteRangeValidator(0x00, 0x01), DEST_DIRECT); // Messages for the Audio Rate Control. addValidationInfo(Constants.MESSAGE_SET_AUDIO_RATE, oneByteValidator, DEST_DIRECT); addValidationInfo( Constants.MESSAGE_SET_AUDIO_RATE, new OneByteRangeValidator(0x00, 0x06), DEST_DIRECT); // All Messages for the ARC have no parameters. Loading Loading @@ -441,4 +454,22 @@ public class HdmiCecMessageValidator { && isValidAsciiString(params, 1, 14)); } } /** Check if the given parameters are one byte parameters and within range. */ private class OneByteRangeValidator implements ParameterValidator { private final int mMinValue, mMaxValue; OneByteRangeValidator(int minValue, int maxValue) { mMinValue = minValue; mMaxValue = maxValue; } @Override public int isValid(byte[] params) { if (params.length < 1) { return ERROR_PARAMETER_SHORT; } return toErrorCode(isWithinRange(params[0], mMinValue, mMaxValue)); } } }
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java +57 −0 Original line number Diff line number Diff line Loading @@ -66,10 +66,67 @@ public class HdmiCecMessageValidatorTest { @Test public void isValid_reportPowerStatus() { assertMessageValidity("04:90:00").isEqualTo(OK); assertMessageValidity("04:90:03:05").isEqualTo(OK); assertMessageValidity("0F:90:00").isEqualTo(ERROR_DESTINATION); assertMessageValidity("F0:90").isEqualTo(ERROR_SOURCE); assertMessageValidity("04:90").isEqualTo(ERROR_PARAMETER_SHORT); assertMessageValidity("04:90:04").isEqualTo(ERROR_PARAMETER); } @Test public void isValid_menuRequest() { assertMessageValidity("40:8D:00").isEqualTo(OK); assertMessageValidity("40:8D:02:04").isEqualTo(OK); assertMessageValidity("0F:8D:00").isEqualTo(ERROR_DESTINATION); assertMessageValidity("F0:8D").isEqualTo(ERROR_SOURCE); assertMessageValidity("40:8D").isEqualTo(ERROR_PARAMETER_SHORT); assertMessageValidity("40:8D:03").isEqualTo(ERROR_PARAMETER); } @Test public void isValid_menuStatus() { assertMessageValidity("40:8E:00").isEqualTo(OK); assertMessageValidity("40:8E:01:00").isEqualTo(OK); assertMessageValidity("0F:8E:00").isEqualTo(ERROR_DESTINATION); assertMessageValidity("F0:8E").isEqualTo(ERROR_SOURCE); assertMessageValidity("40:8E").isEqualTo(ERROR_PARAMETER_SHORT); assertMessageValidity("40:8E:02").isEqualTo(ERROR_PARAMETER); } @Test public void isValid_setSystemAudioMode() { assertMessageValidity("40:72:00").isEqualTo(OK); assertMessageValidity("4F:72:01:03").isEqualTo(OK); assertMessageValidity("F0:72").isEqualTo(ERROR_SOURCE); assertMessageValidity("40:72").isEqualTo(ERROR_PARAMETER_SHORT); assertMessageValidity("40:72:02").isEqualTo(ERROR_PARAMETER); } @Test public void isValid_systemAudioModeStatus() { assertMessageValidity("40:7E:00").isEqualTo(OK); assertMessageValidity("40:7E:01:01").isEqualTo(OK); assertMessageValidity("0F:7E:00").isEqualTo(ERROR_DESTINATION); assertMessageValidity("F0:7E").isEqualTo(ERROR_SOURCE); assertMessageValidity("40:7E").isEqualTo(ERROR_PARAMETER_SHORT); assertMessageValidity("40:7E:02").isEqualTo(ERROR_PARAMETER); } @Test public void isValid_setAudioRate() { assertMessageValidity("40:9A:00").isEqualTo(OK); assertMessageValidity("40:9A:03").isEqualTo(OK); assertMessageValidity("40:9A:06:02").isEqualTo(OK); assertMessageValidity("0F:9A:00").isEqualTo(ERROR_DESTINATION); assertMessageValidity("F0:9A").isEqualTo(ERROR_SOURCE); assertMessageValidity("40:9A").isEqualTo(ERROR_PARAMETER_SHORT); assertMessageValidity("40:9A:07").isEqualTo(ERROR_PARAMETER); } @Test Loading