From a0490747911b69e5b2daf0ffb0561bf8b9b54c31 Mon Sep 17 00:00:00 2001 From: Shraddha Basantwani Date: Thu, 26 Nov 2020 16:12:52 +0530 Subject: [PATCH] CEC : Add additional constraint to validate physical address Test: atest HdmiCecMessageValidatorTest Bug: 170811408 Change-Id: Ieae66cc73ca384940a31480858dc67fab8899160 --- .../server/hdmi/HdmiCecMessageValidator.java | 9 ++- .../hdmi/HdmiCecMessageValidatorTest.java | 65 +++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java index fe68721db040a..c24973d4f2d4f 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java @@ -309,7 +309,14 @@ public class HdmiCecMessageValidator { } private boolean isValidPhysicalAddress(byte[] params, int offset) { - // TODO: Add more logic like validating 1.0.1.0. + int physicalAddress = HdmiUtils.twoBytesToInt(params, offset); + while (physicalAddress != 0) { + int maskedAddress = physicalAddress & 0xF000; + physicalAddress = (physicalAddress << 4) & 0xFFFF; + if (maskedAddress == 0 && physicalAddress != 0) { + return false; + } + } if (!mService.isTvDevice()) { // If the device is not TV, we can't convert path to port-id, so stop here. 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 7676a11504bf4..a54a915929e61 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java @@ -96,6 +96,16 @@ public class HdmiCecMessageValidatorTest { assertMessageValidity("40:8E:02").isEqualTo(ERROR_PARAMETER); } + @Test + public void isValid_systemAudioModeRequest() { + assertMessageValidity("40:70:00:00").isEqualTo(OK); + assertMessageValidity("40:70").isEqualTo(OK); + + assertMessageValidity("F0:70").isEqualTo(ERROR_SOURCE); + // Invalid physical address + assertMessageValidity("40:70:10:10").isEqualTo(ERROR_PARAMETER); + } + @Test public void isValid_setSystemAudioMode() { assertMessageValidity("40:72:00").isEqualTo(OK); @@ -316,6 +326,8 @@ public class HdmiCecMessageValidatorTest { assertMessageValidity("40:A2:14:09:12:28:4B:19:10:08:10:00").isEqualTo(ERROR_PARAMETER); // Invalid External PLug assertMessageValidity("04:A1:0C:08:15:05:04:1E:02:04:00").isEqualTo(ERROR_PARAMETER); + // Invalid Physical Address + assertMessageValidity("40:A2:14:09:12:28:4B:19:10:05:10:10").isEqualTo(ERROR_PARAMETER); } @Test @@ -539,6 +551,59 @@ public class HdmiCecMessageValidatorTest { assertMessageValidity("40:44:57:40").isEqualTo(ERROR_PARAMETER); } + @Test + public void isValid_physicalAddress() { + assertMessageValidity("4F:82:10:00").isEqualTo(OK); + assertMessageValidity("4F:82:12:34").isEqualTo(OK); + assertMessageValidity("0F:82:00:00").isEqualTo(OK); + assertMessageValidity("40:9D:14:00").isEqualTo(OK); + assertMessageValidity("40:9D:10:00").isEqualTo(OK); + assertMessageValidity("0F:81:44:20").isEqualTo(OK); + assertMessageValidity("4F:81:13:10").isEqualTo(OK); + assertMessageValidity("4F:86:14:14").isEqualTo(OK); + assertMessageValidity("0F:86:15:24").isEqualTo(OK); + + assertMessageValidity("4F:82:10").isEqualTo(ERROR_PARAMETER_SHORT); + assertMessageValidity("40:9D:14").isEqualTo(ERROR_PARAMETER_SHORT); + assertMessageValidity("0F:81:44").isEqualTo(ERROR_PARAMETER_SHORT); + assertMessageValidity("0F:86:15").isEqualTo(ERROR_PARAMETER_SHORT); + + assertMessageValidity("4F:82:10:10").isEqualTo(ERROR_PARAMETER); + assertMessageValidity("4F:82:10:06").isEqualTo(ERROR_PARAMETER); + assertMessageValidity("40:9D:14:04").isEqualTo(ERROR_PARAMETER); + assertMessageValidity("40:9D:10:01").isEqualTo(ERROR_PARAMETER); + assertMessageValidity("0F:81:44:02").isEqualTo(ERROR_PARAMETER); + assertMessageValidity("4F:81:13:05").isEqualTo(ERROR_PARAMETER); + assertMessageValidity("4F:86:10:14").isEqualTo(ERROR_PARAMETER); + assertMessageValidity("0F:86:10:24").isEqualTo(ERROR_PARAMETER); + } + + @Test + public void isValid_reportPhysicalAddress() { + assertMessageValidity("4F:84:10:00:04").isEqualTo(OK); + assertMessageValidity("0F:84:00:00:00").isEqualTo(OK); + + assertMessageValidity("4F:84:10:00").isEqualTo(ERROR_PARAMETER_SHORT); + assertMessageValidity("0F:84:00").isEqualTo(ERROR_PARAMETER_SHORT); + assertMessageValidity("40:84:10:00:04").isEqualTo(ERROR_DESTINATION); + // Invalid Physical Address + assertMessageValidity("4F:84:10:10:04").isEqualTo(ERROR_PARAMETER); + assertMessageValidity("0F:84:00:30:00").isEqualTo(ERROR_PARAMETER); + // Invalid Device Type + assertMessageValidity("4F:84:12:34:08").isEqualTo(ERROR_PARAMETER); + } + + @Test + public void isValid_routingChange() { + assertMessageValidity("0F:80:10:00:40:00").isEqualTo(OK); + assertMessageValidity("4F:80:12:00:50:00").isEqualTo(OK); + + assertMessageValidity("0F:80:10:00:40").isEqualTo(ERROR_PARAMETER_SHORT); + assertMessageValidity("40:80:12:00:50:00").isEqualTo(ERROR_DESTINATION); + assertMessageValidity("0F:80:10:01:40:00").isEqualTo(ERROR_PARAMETER); + assertMessageValidity("4F:80:12:00:50:50").isEqualTo(ERROR_PARAMETER); + } + private IntegerSubject assertMessageValidity(String message) { return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message))); }