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

Commit 8252a01d authored by Thomas Nguyen's avatar Thomas Nguyen
Browse files

Fix for NPE in DatagramReceiver

Messaging app crash and send multiple ACK for the same received
datagram. When the second ACK come, the datagram does not
exist in DatagramReceiver's cache. DatagramReceiver try to retrieve that
datagram and leads to NPE.

Bug: 311061018
Test: SMS, MMS, call with live network
atest DatagramReceiverTest
atest SatelliteManagerTestOnMockService

Change-Id: I7c7ae3e9f23f458340e28c7579148c91b6b2ac20
parent 369eea36
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -333,6 +333,10 @@ public class DatagramDispatcher extends Handler {
                        SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING,
                        getPendingDatagramCount(), SatelliteManager.SATELLITE_RESULT_SUCCESS);
                sendRequestAsync(CMD_SEND_SATELLITE_DATAGRAM, datagramArgs, phone);
            } else {
                logd("sendSatelliteDatagram: mSendingDatagramInProgress="
                        + mSendingDatagramInProgress + ", isPollingInIdleState="
                        + mDatagramController.isPollingInIdleState());
            }
        }
    }
+4 −0
Original line number Diff line number Diff line
@@ -392,6 +392,10 @@ public class DatagramReceiver extends Handler {

                case EVENT_RECEIVED_ACK: {
                    DatagramRetryArgument argument = (DatagramRetryArgument) msg.obj;
                    if (!sInstance.mPendingAckCountHashMap.containsKey(argument.datagramId)) {
                        logd("The datagram " + argument.datagramId + " should have been deleted.");
                        return;
                    }
                    int pendingAckCount = sInstance.mPendingAckCountHashMap
                            .get(argument.datagramId);
                    pendingAckCount -= 1;
+2 −0
Original line number Diff line number Diff line
@@ -1722,6 +1722,7 @@ public class SatelliteController extends Handler {
        if (!mSatelliteModemInterface.isSatelliteServiceSupported()) {
            return SatelliteManager.SATELLITE_RESULT_NOT_SUPPORTED;
        }
        logd("registerForSatelliteDatagram: callback=" + callback);
        return mDatagramController.registerForSatelliteDatagram(subId, callback);
    }

@@ -1742,6 +1743,7 @@ public class SatelliteController extends Handler {
        if (!mSatelliteModemInterface.isSatelliteServiceSupported()) {
            return;
        }
        logd("unregisterForSatelliteDatagram: callback=" + callback);
        mDatagramController.unregisterForSatelliteDatagram(subId, callback);
    }

+2 −0
Original line number Diff line number Diff line
@@ -103,12 +103,14 @@ public class SatelliteModemInterface {
        @Override
        public void onSatelliteDatagramReceived(
                android.telephony.satellite.stub.SatelliteDatagram datagram, int pendingCount) {
            logd("onSatelliteDatagramReceived: pendingCount=" + pendingCount);
            mSatelliteDatagramsReceivedRegistrants.notifyResult(new Pair<>(
                    SatelliteServiceUtils.fromSatelliteDatagram(datagram), pendingCount));
        }

        @Override
        public void onPendingDatagrams() {
            logd("onPendingDatagrams");
            mPendingDatagramsRegistrants.notifyResult(null);
        }

+1 −1
Original line number Diff line number Diff line
@@ -401,7 +401,7 @@ public class DatagramDispatcherTest extends TelephonyTest {
        processAllMessages();
        // As modem is busy receiving datagrams, sending datagram did not proceed further.
        mInOrder.verify(mMockDatagramController).needsWaitingForSatelliteConnected();
        mInOrder.verify(mMockDatagramController).isPollingInIdleState();
        mInOrder.verify(mMockDatagramController, times(2)).isPollingInIdleState();
        verifyNoMoreInteractions(mMockDatagramController);
    }

Loading