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

Commit 8718323a authored by Hall Liu's avatar Hall Liu
Browse files

Fix race in TelephonyScanManager

TelephonyScanManager may sometimes encounter a race condition where
Telephony sends it the first scan result before it has saved the
returned scan ID. This causes a crash in the app that's requesting the
scan.

To fix this, synchronize on mScanInfo while requesting the network scan
so that the handler in TelephonyScanManager will wait for the scan ID to
be saved before processing the first message from Telephony.

Bug: 142068098
Test: manual
Change-Id: I0b2b4c6dc749e21641843818293941704ed870a6
parent 5811f477
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ public final class TelephonyScanManager {

    private final Looper mLooper;
    private final Messenger mMessenger;
    private SparseArray<NetworkScanInfo> mScanInfo = new SparseArray<NetworkScanInfo>();
    private final SparseArray<NetworkScanInfo> mScanInfo = new SparseArray<NetworkScanInfo>();

    public TelephonyScanManager() {
        HandlerThread thread = new HandlerThread(TAG);
@@ -204,6 +204,7 @@ public final class TelephonyScanManager {
        try {
            ITelephony telephony = getITelephony();
            if (telephony != null) {
                synchronized (mScanInfo) {
                    int scanId = telephony.requestNetworkScan(
                            subId, request, mMessenger, new Binder(), callingPackage);
                    if (scanId == INVALID_SCAN_ID) {
@@ -213,6 +214,7 @@ public final class TelephonyScanManager {
                    saveScanInfo(scanId, request, executor, callback);
                    return new NetworkScan(scanId, subId);
                }
            }
        } catch (RemoteException ex) {
            Rlog.e(TAG, "requestNetworkScan RemoteException", ex);
        } catch (NullPointerException ex) {
@@ -223,10 +225,8 @@ public final class TelephonyScanManager {

    private void saveScanInfo(
            int id, NetworkScanRequest request, Executor executor, NetworkScanCallback callback) {
        synchronized (mScanInfo) {
        mScanInfo.put(id, new NetworkScanInfo(request, executor, callback));
    }
    }

    private ITelephony getITelephony() {
        return ITelephony.Stub.asInterface(