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

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

Fixed concurrent access network registration info

Fixed by adding synchronization block for every place
accessing network registration info in service state.

Bug: 131883293
Test: Manual
Merged-In: Ic10931b7fab998bfebe09d316a2d87886222dae3
Change-Id: Ic10931b7fab998bfebe09d316a2d87886222dae3
(cherry picked from commit 4c118097)
parent fa5c6e2c
Loading
Loading
Loading
Loading
+115 −100
Original line number Diff line number Diff line
@@ -337,7 +337,7 @@ public class ServiceState implements Parcelable {
     * Reference: 3GPP TS 36.104 5.4.3 */
    private int mLteEarfcnRsrpBoost = 0;

    private List<NetworkRegistrationInfo> mNetworkRegistrationInfos = new ArrayList<>();
    private final List<NetworkRegistrationInfo> mNetworkRegistrationInfos = new ArrayList<>();

    private String mOperatorAlphaLongRaw;
    private String mOperatorAlphaShortRaw;
@@ -420,8 +420,10 @@ public class ServiceState implements Parcelable {
        mCellBandwidths = s.mCellBandwidths == null ? null :
                Arrays.copyOf(s.mCellBandwidths, s.mCellBandwidths.length);
        mLteEarfcnRsrpBoost = s.mLteEarfcnRsrpBoost;
        mNetworkRegistrationInfos = s.mNetworkRegistrationInfos == null ? null :
                s.getNetworkRegistrationInfoList();
        synchronized (mNetworkRegistrationInfos) {
            mNetworkRegistrationInfos.clear();
            mNetworkRegistrationInfos.addAll(s.getNetworkRegistrationInfoList());
        }
        mNrFrequencyRange = s.mNrFrequencyRange;
        mOperatorAlphaLongRaw = s.mOperatorAlphaLongRaw;
        mOperatorAlphaShortRaw = s.mOperatorAlphaShortRaw;
@@ -453,8 +455,9 @@ public class ServiceState implements Parcelable {
        mCdmaEriIconMode = in.readInt();
        mIsEmergencyOnly = in.readInt() != 0;
        mLteEarfcnRsrpBoost = in.readInt();
        mNetworkRegistrationInfos = new ArrayList<>();
        synchronized (mNetworkRegistrationInfos) {
            in.readList(mNetworkRegistrationInfos, NetworkRegistrationInfo.class.getClassLoader());
        }
        mChannelNumber = in.readInt();
        mCellBandwidths = in.createIntArray();
        mNrFrequencyRange = in.readInt();
@@ -481,7 +484,9 @@ public class ServiceState implements Parcelable {
        out.writeInt(mCdmaEriIconMode);
        out.writeInt(mIsEmergencyOnly ? 1 : 0);
        out.writeInt(mLteEarfcnRsrpBoost);
        synchronized (mNetworkRegistrationInfos) {
            out.writeList(mNetworkRegistrationInfos);
        }
        out.writeInt(mChannelNumber);
        out.writeIntArray(mCellBandwidths);
        out.writeInt(mNrFrequencyRange);
@@ -823,6 +828,7 @@ public class ServiceState implements Parcelable {

    @Override
    public int hashCode() {
        synchronized (mNetworkRegistrationInfos) {
            return Objects.hash(
                    mVoiceRegState,
                    mDataRegState,
@@ -849,12 +855,14 @@ public class ServiceState implements Parcelable {
                    mOperatorAlphaLongRaw,
                    mOperatorAlphaShortRaw);
        }
    }

    @Override
    public boolean equals (Object o) {
        if (!(o instanceof ServiceState)) return false;
        ServiceState s = (ServiceState) o;

        synchronized (mNetworkRegistrationInfos) {
            return mVoiceRegState == s.mVoiceRegState
                    && mDataRegState == s.mDataRegState
                    && mIsManualNetworkSelection == s.mIsManualNetworkSelection
@@ -875,11 +883,11 @@ public class ServiceState implements Parcelable {
                    && mIsEmergencyOnly == s.mIsEmergencyOnly
                    && equalsHandlesNulls(mOperatorAlphaLongRaw, s.mOperatorAlphaLongRaw)
                    && equalsHandlesNulls(mOperatorAlphaShortRaw, s.mOperatorAlphaShortRaw)
                && (mNetworkRegistrationInfos == null
                ? s.mNetworkRegistrationInfos == null : s.mNetworkRegistrationInfos != null
                && mNetworkRegistrationInfos.containsAll(s.mNetworkRegistrationInfos))
                    && mNetworkRegistrationInfos.size() == s.mNetworkRegistrationInfos.size()
                    && mNetworkRegistrationInfos.containsAll(s.mNetworkRegistrationInfos)
                    && mNrFrequencyRange == s.mNrFrequencyRange;
        }
    }

    /**
     * Convert roaming type to string
@@ -1005,6 +1013,7 @@ public class ServiceState implements Parcelable {

    @Override
    public String toString() {
        synchronized (mNetworkRegistrationInfos) {
            return new StringBuilder().append("{mVoiceRegState=").append(mVoiceRegState)
                    .append("(" + rilServiceStateToString(mVoiceRegState) + ")")
                    .append(", mDataRegState=").append(mDataRegState)
@@ -1036,6 +1045,7 @@ public class ServiceState implements Parcelable {
                    .append(", mOperatorAlphaShortRaw=").append(mOperatorAlphaShortRaw)
                    .append("}").toString();
        }
    }

    private void init() {
        if (DBG) Rlog.d(LOG_TAG, "init");
@@ -1060,6 +1070,7 @@ public class ServiceState implements Parcelable {
        mIsEmergencyOnly = false;
        mLteEarfcnRsrpBoost = 0;
        mNrFrequencyRange = FREQUENCY_RANGE_UNKNOWN;
        synchronized (mNetworkRegistrationInfos) {
            mNetworkRegistrationInfos.clear();
            addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder()
                    .setDomain(NetworkRegistrationInfo.DOMAIN_CS)
@@ -1071,6 +1082,7 @@ public class ServiceState implements Parcelable {
                    .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                    .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_UNKNOWN)
                    .build());
        }
        mOperatorAlphaLongRaw = null;
        mOperatorAlphaShortRaw = null;
    }
@@ -1913,10 +1925,13 @@ public class ServiceState implements Parcelable {
     */
    public ServiceState sanitizeLocationInfo(boolean removeCoarseLocation) {
        ServiceState state = new ServiceState(this);
        if (state.mNetworkRegistrationInfos != null) {
            state.mNetworkRegistrationInfos = state.mNetworkRegistrationInfos.stream()
        synchronized (state.mNetworkRegistrationInfos) {
            List<NetworkRegistrationInfo> networkRegistrationInfos =
                    state.mNetworkRegistrationInfos.stream()
                            .map(NetworkRegistrationInfo::sanitizeLocationInfo)
                            .collect(Collectors.toList());
            state.mNetworkRegistrationInfos.clear();
            state.mNetworkRegistrationInfos.addAll(networkRegistrationInfos);
        }
        if (!removeCoarseLocation) return state;