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

Commit bbdceb95 authored by Paul's avatar Paul
Browse files

HDMICEC: Add a new validation to CEC messages

Add one more parameter to the isValid() method to indicate if the message that needs to be validated is sent or received by the device.

Add a filter that ignores received messages which have source's logical address equal to device's logical address.

Revise isValid() calls and tests affected by the change.

Edit HdmiControlServiceTest#handleCecCommand_errorParameter_returnsAbortInvalidOperand() test. Since the logical address Constants.ADDR_PLAYBACK_1 is already used by mPlaybackDeviceSpy the message's source is set to Constants.ADDR_PLAYBACK_2; otherwise HdmiCecMessageValidator#isValid() fails with a different error code than expected.

Bug: 196943901
Bug: 198261021
Test: make && atest CtsHdmiCecHostTestCases
Change-Id: I274a9a2385d616784dfc891aabd8f335c32658da
Merged-In: I274a9a2385d616784dfc891aabd8f335c32658da
parent c39842ab
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -242,7 +242,7 @@ public class HdmiCecMessageValidator {
        mValidationInfo.append(opcode, new ValidationInfo(validator, addrType));
    }

    int isValid(HdmiCecMessage message) {
    int isValid(HdmiCecMessage message, boolean isMessageReceived) {
        int opcode = message.getOpcode();
        ValidationInfo info = mValidationInfo.get(opcode);
        if (info == null) {
@@ -256,6 +256,22 @@ public class HdmiCecMessageValidator {
            HdmiLogger.warning("Unexpected source: " + message);
            return ERROR_SOURCE;
        }

        if (isMessageReceived) {
            // Check if the source's logical address and local device's logical
            // address are the same.
            for (HdmiCecLocalDevice device : mService.getAllLocalDevices()) {
                synchronized (device.mLock) {
                    if (message.getSource() == device.getDeviceInfo().getLogicalAddress()
                            && message.getSource() != Constants.ADDR_UNREGISTERED) {
                        HdmiLogger.warning(
                                "Unexpected source: message sent from device itself, " + message);
                        return ERROR_SOURCE;
                    }
                }
            }
        }

        // Check the destination field.
        if (message.getDestination() == Constants.ADDR_BROADCAST) {
            if ((info.addressType & DEST_BROADCAST) == 0) {
+4 −4
Original line number Diff line number Diff line
@@ -1122,7 +1122,7 @@ public class HdmiControlService extends SystemService {
    @ServiceThreadOnly
    void sendCecCommand(HdmiCecMessage command, @Nullable SendMessageCallback callback) {
        assertRunOnServiceThread();
        if (mMessageValidator.isValid(command) == HdmiCecMessageValidator.OK) {
        if (mMessageValidator.isValid(command, false) == HdmiCecMessageValidator.OK) {
            mCecController.sendCommand(command, callback);
        } else {
            HdmiLogger.error("Invalid message type:" + command);
@@ -1153,7 +1153,7 @@ public class HdmiControlService extends SystemService {
    @ServiceThreadOnly
    boolean handleCecCommand(HdmiCecMessage message) {
        assertRunOnServiceThread();
        int errorCode = mMessageValidator.isValid(message);
        int errorCode = mMessageValidator.isValid(message, true);
        if (errorCode != HdmiCecMessageValidator.OK) {
            // We'll not response on the messages with the invalid source or destination
            // or with parameter length shorter than specified in the standard.
+1 −1
Original line number Diff line number Diff line
@@ -125,7 +125,7 @@ public class HdmiCecLocalDeviceTest {
        mMessageValidator =
                new HdmiCecMessageValidator(mHdmiControlService) {
                    @Override
                    int isValid(HdmiCecMessage message) {
                    int isValid(HdmiCecMessage message, boolean isMessageReceived) {
                        return HdmiCecMessageValidator.OK;
                    }
                };
+1 −1
Original line number Diff line number Diff line
@@ -629,7 +629,7 @@ public class HdmiCecMessageValidatorTest {
    }

    private IntegerSubject assertMessageValidity(String message) {
        return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message)));
        return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message), false));
    }

    /**