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

Commit db7565b9 authored by Jack Yu's avatar Jack Yu
Browse files

Fixed NPE when local or remote port range does not exist

Added null check for local and remote port range.

Bug: 213523984
Bug: 213139361
Test: atest QosBearerSessionTest
Merged-In: Ic6bdeac05fedd02045d094fe2d1cbbaa7413208a
Change-Id: Ic6bdeac05fedd02045d094fe2d1cbbaa7413208a
parent 36df29f0
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -226,6 +226,7 @@ public class QosCallbackTracker {

    private boolean matchesByLocalAddress(
        QosBearerFilter sessionFilter, final IFilter filter) {
        if (sessionFilter.getLocalPortRange() == null) return false;
        for (final LinkAddress qosAddress: sessionFilter.getLocalAddresses()) {
            return filter.matchesLocalAddress(qosAddress.getAddress(),
                  sessionFilter.getLocalPortRange().getStart(),
@@ -236,6 +237,7 @@ public class QosCallbackTracker {

    private boolean matchesByRemoteAddress(
            QosBearerFilter sessionFilter, final IFilter filter) {
        if (sessionFilter.getRemotePortRange() == null) return false;
        for (final LinkAddress qosAddress : sessionFilter.getRemoteAddresses()) {
            return filter.matchesRemoteAddress(qosAddress.getAddress(),
                  sessionFilter.getRemotePortRange().getStart(),
@@ -246,6 +248,8 @@ public class QosCallbackTracker {

    private boolean matchesByRemoteAndLocalAddress(
            QosBearerFilter sessionFilter, final IFilter filter) {
        if (sessionFilter.getLocalPortRange() == null
                || sessionFilter.getRemotePortRange() == null) return false;
        for (final LinkAddress remoteAddress : sessionFilter.getRemoteAddresses()) {
            for (final LinkAddress localAddress : sessionFilter.getLocalAddresses()) {
                return filter.matchesRemoteAddress(remoteAddress.getAddress(),
@@ -273,17 +277,21 @@ public class QosCallbackTracker {
        for (final QosBearerFilter sessionFilter : qosBearerSession.getQosBearerFilterList()) {
           if (!sessionFilter.getLocalAddresses().isEmpty()
                   && !sessionFilter.getRemoteAddresses().isEmpty()
                   && sessionFilter.getLocalPortRange() != null
                   && sessionFilter.getLocalPortRange().isValid()
                   && sessionFilter.getRemotePortRange() != null
                   && sessionFilter.getRemotePortRange().isValid()) {
               if (matchesByRemoteAndLocalAddress(sessionFilter, filter)) {
                   qosFilter = getFilterByPrecedence(qosFilter, sessionFilter);
               }
           } else if (!sessionFilter.getRemoteAddresses().isEmpty()
                   && sessionFilter.getRemotePortRange() != null
                   && sessionFilter.getRemotePortRange().isValid()) {
               if (matchesByRemoteAddress(sessionFilter, filter)) {
                   qosFilter = getFilterByPrecedence(qosFilter, sessionFilter);
               }
           } else if (!sessionFilter.getLocalAddresses().isEmpty()
                   && sessionFilter.getLocalPortRange() != null
                   && sessionFilter.getLocalPortRange().isValid()) {
               if (matchesByLocalAddress(sessionFilter, filter)) {
                   qosFilter = getFilterByPrecedence(qosFilter, sessionFilter);
@@ -297,7 +305,8 @@ public class QosCallbackTracker {
            @NonNull final QosBearerSession session, @NonNull IFilter filter) {
        QosBearerFilter qosBearerFilter = getMatchingQosBearerFilter(session, filter);
        List<InetSocketAddress> remoteAddresses = new ArrayList<>();
        if(qosBearerFilter.getRemoteAddresses().size() > 0) {
        if (qosBearerFilter.getRemoteAddresses().size() > 0
                && qosBearerFilter.getRemotePortRange() != null) {
            remoteAddresses.add(
                  new InetSocketAddress(qosBearerFilter.getRemoteAddresses().get(0).getAddress(),
                  qosBearerFilter.getRemotePortRange().getStart()));
@@ -387,6 +396,7 @@ public class QosCallbackTracker {
    private boolean doesLocalConnectionInfoExist(final QosBearerSession qosBearerSession) {
        for (final QosBearerFilter sessionFilter : qosBearerSession.getQosBearerFilterList()) {
            if (!sessionFilter.getLocalAddresses().isEmpty()
                    && sessionFilter.getLocalPortRange() != null
                    && sessionFilter.getLocalPortRange().isValid()) {
                return true;
            }
@@ -397,6 +407,7 @@ public class QosCallbackTracker {
    private boolean doesRemoteConnectionInfoExist(final QosBearerSession qosBearerSession) {
        for (final QosBearerFilter sessionFilter : qosBearerSession.getQosBearerFilterList()) {
            if (!sessionFilter.getRemoteAddresses().isEmpty()
                    && sessionFilter.getRemotePortRange() != null
                    && sessionFilter.getRemotePortRange().isValid()) {
                return true;
            }
+68 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.internal.telephony.dataconnection;

import static com.android.internal.telephony.dataconnection.QosCallbackTrackerTest.createEpsQos;
import static com.android.internal.telephony.dataconnection.QosCallbackTrackerTest.createIpv4QosFilter;

import static com.google.common.truth.Truth.assertThat;

import android.os.Parcel;
import android.telephony.data.QosBearerFilter;
import android.telephony.data.QosBearerSession;

import com.android.internal.telephony.TelephonyTest;

import org.junit.Test;

import java.util.ArrayList;

public class QosBearerSessionTest extends TelephonyTest {

    @Test
    public void testParcel() {
        ArrayList<QosBearerFilter> qosFilters = new ArrayList<>();
        qosFilters.add(createIpv4QosFilter("122.22.22.22",
                new QosBearerFilter.PortRange(2222, 2222), 45));
        QosBearerSession qosBearerSession = new QosBearerSession(1235,
                createEpsQos(5, 6, 7, 8), qosFilters);

        Parcel p = Parcel.obtain();
        qosBearerSession.writeToParcel(p, 0);
        p.setDataPosition(0);

        QosBearerSession qosBearerSession2 = QosBearerSession.CREATOR.createFromParcel(p);
        assertThat(qosBearerSession).isEqualTo(qosBearerSession2);
    }

    @Test
    public void testEquals() {
        ArrayList<QosBearerFilter> qosFilters = new ArrayList<>();
        qosFilters.add(createIpv4QosFilter("122.22.22.22",
                new QosBearerFilter.PortRange(2222, 2222), 45));
        QosBearerSession qosBearerSession = new QosBearerSession(1235,
                createEpsQos(5, 6, 7, 8), qosFilters);

        ArrayList<QosBearerFilter> qosFilters2 = new ArrayList<>();
        qosFilters2.add(createIpv4QosFilter("122.22.22.22",
                new QosBearerFilter.PortRange(2222, 2222), 45));
        QosBearerSession qosBearerSession2 = new QosBearerSession(1235,
                createEpsQos(5, 6, 7, 8), qosFilters2);

        assertThat(qosBearerSession).isEqualTo(qosBearerSession2);
    }
}
+3 −3
Original line number Diff line number Diff line
@@ -114,7 +114,7 @@ public class QosCallbackTrackerTest extends TelephonyTest {
        super.tearDown();
    }

    private EpsQos createEpsQos(int dlMbr, int ulMbr, int dlGbr, int ulGbr) {
    public static EpsQos createEpsQos(int dlMbr, int ulMbr, int dlGbr, int ulGbr) {
        // Build android.hardware.radio.V1_6.EpsQos
        android.hardware.radio.V1_6.EpsQos halEpsQos = new android.hardware.radio.V1_6.EpsQos();
        halEpsQos.qci = 4;
@@ -126,7 +126,7 @@ public class QosCallbackTrackerTest extends TelephonyTest {
        return new EpsQos(halEpsQos);
    }

    private QosBearerFilter createIpv4QosFilter(String localAddress,
    public static QosBearerFilter createIpv4QosFilter(String localAddress,
            QosBearerFilter.PortRange localPort, int precedence) {
        return new QosBearerFilter(
                Arrays.asList(
@@ -135,7 +135,7 @@ public class QosCallbackTrackerTest extends TelephonyTest {
                7, 987, 678, QosBearerFilter.QOS_FILTER_DIRECTION_BIDIRECTIONAL, precedence);
    }

    private QosBearerFilter createIpv4QosFilter(String localAddress, String remoteAddress,
    public static QosBearerFilter createIpv4QosFilter(String localAddress, String remoteAddress,
            QosBearerFilter.PortRange localPort, QosBearerFilter.PortRange remotePort,
            int precedence) {
        return new QosBearerFilter(