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

Commit 210ec3af 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
Change-Id: Ic6bdeac05fedd02045d094fe2d1cbbaa7413208a
parent bff45b23
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -280,6 +280,7 @@ public class QosCallbackTracker extends Handler {

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

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

    private boolean matchesByRemoteAndLocalAddress(@NonNull QosBearerFilter sessionFilter,
            final @NonNull 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(),
@@ -327,17 +331,21 @@ public class QosCallbackTracker extends Handler {
        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);
@@ -351,7 +359,8 @@ public class QosCallbackTracker extends Handler {
            @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()));
@@ -437,6 +446,7 @@ public class QosCallbackTracker extends Handler {
    private boolean doesLocalConnectionInfoExist(final QosBearerSession qosBearerSession) {
        for (final QosBearerFilter sessionFilter : qosBearerSession.getQosBearerFilterList()) {
            if (!sessionFilter.getLocalAddresses().isEmpty()
                    && sessionFilter.getLocalPortRange() != null
                    && sessionFilter.getLocalPortRange().isValid()) {
                return true;
            }
@@ -447,6 +457,7 @@ public class QosCallbackTracker extends Handler {
    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.data;

import static com.android.internal.telephony.data.QosCallbackTrackerTest.createEpsQos;
import static com.android.internal.telephony.data.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
@@ -116,7 +116,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;
@@ -129,7 +129,7 @@ public class QosCallbackTrackerTest extends TelephonyTest {
                new Qos.QosBandwidth(dlMbr, dlGbr), new Qos.QosBandwidth(ulMbr, ulGbr), 4);
    }

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

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