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

Commit b6f1cc05 authored by Grace Jia's avatar Grace Jia
Browse files

Fix NPE in SmsDispatchersController.

Improve and add new log to figure out what caused the NPE.

Bug: 167688467
Test: atest FrameworksTelephonyTests:SmsDispatchersControllerTest
Change-Id: Ib7cf6cbde8e9fd2d16c73ea1a090644276c1e451
parent 962e4791
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -466,12 +466,18 @@ public class SmsDispatchersController extends Handler {
            }
            String scAddr = (String) map.get("scAddr");
            String destAddr = (String) map.get("destAddr");
            if (destAddr == null) {
                Rlog.e(TAG, "sendRetrySms failed due to null destAddr");
                tracker.onFailed(mContext, SmsManager.RESULT_SMS_SEND_RETRY_FAILED, NO_ERROR_CODE);
                return;
            }

            SmsMessageBase.SubmitPduBase pdu = null;
            // figure out from tracker if this was sendText/Data
            if (map.containsKey("text")) {
                Rlog.d(TAG, "sms failed was text");
                String text = (String) map.get("text");
                Rlog.d(TAG, "sms failed was text with length: "
                        + (text == null ? null : text.length()));

                if (isCdmaFormat(newFormat)) {
                    pdu = com.android.internal.telephony.cdma.SmsMessage.getSubmitPdu(
@@ -481,9 +487,10 @@ public class SmsDispatchersController extends Handler {
                            scAddr, destAddr, text, (tracker.mDeliveryIntent != null), null);
                }
            } else if (map.containsKey("data")) {
                Rlog.d(TAG, "sms failed was data");
                byte[] data = (byte[]) map.get("data");
                Integer destPort = (Integer) map.get("destPort");
                Rlog.d(TAG, "sms failed was data with length: "
                        + (data == null ? null : data.length));

                if (isCdmaFormat(newFormat)) {
                    pdu = com.android.internal.telephony.cdma.SmsMessage.getSubmitPdu(
@@ -496,6 +503,13 @@ public class SmsDispatchersController extends Handler {
                }
            }

            if (pdu == null) {
                Rlog.e(TAG, String.format("sendRetrySms failed to encode message."
                        + "scAddr: %s, "
                        + "destPort: %s", scAddr, map.get("destPort")));
                tracker.onFailed(mContext, SmsManager.RESULT_SMS_SEND_RETRY_FAILED, NO_ERROR_CODE);
                return;
            }
            // replace old smsc and pdu with newly encoded ones
            map.put("smsc", pdu.encodedScAddress);
            map.put("pdu", pdu.encodedMessage);
+22 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.internal.telephony;

import static com.android.internal.telephony.SmsResponse.NO_ERROR_CODE;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -27,10 +29,12 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.app.ActivityManager;
import android.os.Message;
import android.provider.Telephony.Sms.Intents;
import android.telephony.SmsManager;
import android.test.FlakyTest;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
@@ -44,6 +48,8 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;

import java.util.HashMap;

@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class SmsDispatchersControllerTest extends TelephonyTest {
@@ -137,6 +143,22 @@ public class SmsDispatchersControllerTest extends TelephonyTest {
                eq(0), any(Message.class));
    }

    @Test @SmallTest
    public void testSendRetrySmsNullPdu() throws Exception {
        HashMap<String, Object> map = new HashMap<>();
        map.put("scAddr", "");
        map.put("destAddr", "");
        map.put("text", null);
        map.put("destPort", 0);
        switchImsSmsFormat(PhoneConstants.PHONE_TYPE_GSM);
        replaceInstance(SMSDispatcher.SmsTracker.class, "mFormat", mTracker,
                SmsConstants.FORMAT_3GPP2);
        when(mTracker.getData()).thenReturn(map);
        mSmsDispatchersController.sendRetrySms(mTracker);
        verify(mTracker).onFailed(eq(mContext), eq(SmsManager.RESULT_SMS_SEND_RETRY_FAILED),
                eq(NO_ERROR_CODE));
    }

    @Test @SmallTest
    public void testInjectNullSmsPdu() throws Exception {
        // unmock ActivityManager to be able to register receiver, create real PendingIntent and