diff --git a/src/org/thoughtcrime/securesms/crypto/MmsCipher.java b/src/org/thoughtcrime/securesms/crypto/MmsCipher.java index 56a49df64..29832a522 100644 --- a/src/org/thoughtcrime/securesms/crypto/MmsCipher.java +++ b/src/org/thoughtcrime/securesms/crypto/MmsCipher.java @@ -8,6 +8,7 @@ import org.thoughtcrime.securesms.protocol.WirePrefix; import org.thoughtcrime.securesms.recipients.RecipientFactory; import org.thoughtcrime.securesms.recipients.RecipientFormattingException; import org.thoughtcrime.securesms.recipients.Recipients; +import org.thoughtcrime.securesms.transport.UndeliverableMessageException; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.libaxolotl.DuplicateMessageException; import org.whispersystems.libaxolotl.InvalidMessageException; @@ -84,7 +85,7 @@ public class MmsCipher { } public SendReq encrypt(Context context, SendReq message) - throws NoSessionException, RecipientFormattingException + throws NoSessionException, RecipientFormattingException, UndeliverableMessageException { EncodedStringValue[] encodedRecipient = message.getTo(); String recipientString = encodedRecipient[0].getString(); @@ -92,6 +93,10 @@ public class MmsCipher { long recipientId = recipients.getPrimaryRecipient().getRecipientId(); byte[] pduBytes = new PduComposer(context, message).make(); + if (pduBytes == null) { + throw new UndeliverableMessageException("PDU composition failed, null payload"); + } + if (!axolotlStore.containsSession(recipientId, PushAddress.DEFAULT_DEVICE_ID)) { throw new NoSessionException("No session for: " + recipientId); } diff --git a/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java b/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java index 9bd434cbd..cb297bb6d 100644 --- a/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java @@ -149,6 +149,8 @@ public class MmsSendJob extends SendJob { String number = ((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE)).getLine1Number(); boolean upgradedSecure = false; + prepareMessageMedia(masterSecret, message, MediaConstraints.MMS_CONSTRAINTS, true); + if (MmsDatabase.Types.isSecureType(message.getDatabaseMessageBox())) { message = getEncryptedMessage(masterSecret, message); upgradedSecure = true; @@ -158,10 +160,14 @@ public class MmsSendJob extends SendJob { message.setFrom(new EncodedStringValue(number)); } - prepareMessageMedia(masterSecret, message, MediaConstraints.MMS_CONSTRAINTS, true); - try { - OutgoingMmsConnection connection = new OutgoingMmsConnection(context, radio.getApnInformation(), new PduComposer(context, message).make()); + byte[] pdu = new PduComposer(context, message).make(); + + if (pdu == null) { + throw new UndeliverableMessageException("PDU composition failed, null payload"); + } + + OutgoingMmsConnection connection = new OutgoingMmsConnection(context, radio.getApnInformation(), pdu); SendConf conf = connection.send(usingMmsRadio, useProxy); if (conf == null) { @@ -179,7 +185,7 @@ public class MmsSendJob extends SendJob { } private SendReq getEncryptedMessage(MasterSecret masterSecret, SendReq pdu) - throws InsecureFallbackApprovalException + throws InsecureFallbackApprovalException, UndeliverableMessageException { try { MmsCipher cipher = new MmsCipher(new TextSecureAxolotlStore(context, masterSecret));