OSDN Git Service

Add empty CdmaSmsSubaddress to CDMA PDU parsing
authorBrad Ebinger <breadley@google.com>
Thu, 15 Mar 2018 22:18:57 +0000 (15:18 -0700)
committerBrad Ebinger <breadley@google.com>
Mon, 19 Mar 2018 22:52:42 +0000 (15:52 -0700)
We were not providing an empty subaddress when
parsing CDMA PDU, which caused an NPE when receiving
CDMA IMS SMS.

Bug: 73994015
Test: Manual, MT/MO SMS
Merged-In: Ic8e24c73cbb9a22236bb153ba290338184504cc3
Change-Id: I07be3ac64341eb9235f6da1b6870ac746188f73a

telephony/java/com/android/internal/telephony/cdma/SmsMessage.java

index 14c5f4b..964a313 100644 (file)
@@ -470,6 +470,9 @@ public class SmsMessage extends SmsMessageBase {
         int bearerDataLength;
         SmsEnvelope env = new SmsEnvelope();
         CdmaSmsAddress addr = new CdmaSmsAddress();
+        // We currently do not parse subaddress in PDU, but it is required when determining
+        // fingerprint (see getIncomingSmsFingerprint()).
+        CdmaSmsSubaddress subaddr = new CdmaSmsSubaddress();
 
         try {
             env.messageType = dis.readInt();
@@ -520,6 +523,7 @@ public class SmsMessage extends SmsMessageBase {
         // link the filled objects to this SMS
         mOriginatingAddress = addr;
         env.origAddress = addr;
+        env.origSubaddress = subaddr;
         mEnvelope = env;
         mPdu = pdu;
 
@@ -1009,8 +1013,11 @@ public class SmsMessage extends SmsMessageBase {
         output.write(mEnvelope.teleService);
         output.write(mEnvelope.origAddress.origBytes, 0, mEnvelope.origAddress.origBytes.length);
         output.write(mEnvelope.bearerData, 0, mEnvelope.bearerData.length);
-        output.write(mEnvelope.origSubaddress.origBytes, 0,
-                mEnvelope.origSubaddress.origBytes.length);
+        // subaddress is not set when parsing some MT SMS.
+        if (mEnvelope.origSubaddress != null && mEnvelope.origSubaddress.origBytes != null) {
+            output.write(mEnvelope.origSubaddress.origBytes, 0,
+                    mEnvelope.origSubaddress.origBytes.length);
+        }
 
         return output.toByteArray();
     }