From 22018a8ce7e8f278e548b84e6664406b3f45f927 Mon Sep 17 00:00:00 2001 From: Brad Ebinger Date: Thu, 15 Mar 2018 15:18:57 -0700 Subject: [PATCH] Add empty CdmaSmsSubaddress to CDMA PDU parsing 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 Change-Id: I07be3ac64341eb9235f6da1b6870ac746188f73a --- .../android/internal/telephony/cdma/SmsMessage.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java index 14c5f4bebebb2..964a31304db59 100644 --- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java @@ -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(); }