summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java45
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java57
2 files changed, 95 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
index d4593afe18fe..7d766285bdfa 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
@@ -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.
@@ -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,
@@ -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.
@@ -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));
+ }
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
index 2896a636e3e1..470294073535 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
@@ -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