HDMICEC: Invalidate <Active Source> from unexpected logical addresses

The <Active Source> message can only be processed if it is received from a logical address that is not specific to recorders or audio systems.

Test: atest HdmiCecMessageValidatorTest
Bug: 238417516
Change-Id: Ib0d4169d87d4aa8589a0a12916968f6deb1071f4
This commit is contained in:
Paul Colta
2023-05-04 12:40:43 +02:00
parent 4d84fbe583
commit b0629d4582
3 changed files with 25 additions and 28 deletions

View File

@@ -99,7 +99,8 @@ public class HdmiCecMessageValidator {
// Messages related to the physical address.
PhysicalAddressValidator physicalAddressValidator = new PhysicalAddressValidator();
addValidationInfo(Constants.MESSAGE_ACTIVE_SOURCE,
physicalAddressValidator, ADDR_ALL, ADDR_BROADCAST);
physicalAddressValidator, ADDR_ALL ^ (ADDR_RECORDER_1 | ADDR_RECORDER_2
| ADDR_AUDIO_SYSTEM | ADDR_RECORDER_3), ADDR_BROADCAST);
addValidationInfo(Constants.MESSAGE_INACTIVE_SOURCE,
physicalAddressValidator, ADDR_NOT_UNREGISTERED, ADDR_DIRECT);
addValidationInfo(Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS,

View File

@@ -149,31 +149,4 @@ public class ActiveSourceActionTest {
assertThat(playbackDevice.getActiveSource().physicalAddress).isEqualTo(mPhysicalAddress);
assertThat(playbackDevice.isActiveSource()).isTrue();
}
@Test
public void audioDevice_sendsActiveSource_noMenuStatus() {
HdmiCecLocalDeviceAudioSystem audioDevice = new HdmiCecLocalDeviceAudioSystem(
mHdmiControlService);
audioDevice.init();
mLocalDevices.add(audioDevice);
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll();
HdmiCecFeatureAction action = new com.android.server.hdmi.ActiveSourceAction(
audioDevice, ADDR_TV);
audioDevice.addAndStartAction(action);
mTestLooper.dispatchAll();
HdmiCecMessage activeSource =
HdmiCecMessageBuilder.buildActiveSource(
audioDevice.getDeviceInfo().getLogicalAddress(), mPhysicalAddress);
HdmiCecMessage menuStatus =
HdmiCecMessageBuilder.buildReportMenuStatus(
audioDevice.getDeviceInfo().getLogicalAddress(),
ADDR_TV,
Constants.MENU_STATE_ACTIVATED);
assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(menuStatus);
}
}

View File

@@ -16,6 +16,11 @@
package com.android.server.hdmi;
import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
import static com.android.server.hdmi.Constants.ADDR_RECORDER_1;
import static com.android.server.hdmi.Constants.ADDR_RECORDER_2;
import static com.android.server.hdmi.Constants.ADDR_RECORDER_3;
import static com.android.server.hdmi.HdmiCecMessageValidator.ERROR_DESTINATION;
import static com.android.server.hdmi.HdmiCecMessageValidator.ERROR_PARAMETER;
import static com.android.server.hdmi.HdmiCecMessageValidator.ERROR_PARAMETER_LONG;
@@ -38,7 +43,9 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/** Tests for {@link com.android.server.hdmi.HdmiCecMessageValidator} class. */
@SmallTest
@@ -640,6 +647,22 @@ public class HdmiCecMessageValidatorTest {
assertMessageValidity("4F:80:12:00:50:50").isEqualTo(ERROR_PARAMETER);
}
@Test
public void isValid_activeSource() {
// Only source devices should broadcast <Active Source> messages.
List<Integer> nonSourceDevicesAddresses = Arrays.asList(ADDR_RECORDER_1, ADDR_RECORDER_2,
ADDR_AUDIO_SYSTEM, ADDR_RECORDER_3);
for (int i = 0; i < ADDR_BROADCAST; ++i) {
String message = Integer.toHexString(i) + "F:82:10:00";
if (nonSourceDevicesAddresses.contains(i)) {
assertMessageValidity(message).isEqualTo(ERROR_SOURCE);
} else {
assertMessageValidity(message).isEqualTo(OK);
}
}
}
private IntegerSubject assertMessageValidity(String message) {
return assertThat(HdmiUtils.buildMessage(message).getValidationResult());
}