Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b0629d45 authored by Paul Colta's avatar Paul Colta
Browse files

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
parent 4d84fbe5
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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,
+0 −27
Original line number Diff line number Diff line
@@ -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);
    }
}
+23 −0
Original line number Diff line number Diff line
@@ -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());
    }