From db4634a0dd904cc86486acdba8ab24a0d33ea05b Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 16 Jan 2024 09:18:00 -0500 Subject: [PATCH] Fix potential NPE during group send. --- .../signalservice/api/SignalServiceMessageSender.java | 6 ++++-- .../signalservice/api/crypto/SignalSealedSessionCipher.java | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index a082752d9e..e5a46c2b30 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -2114,10 +2114,12 @@ public class SignalServiceMessageSender { } for (int i = 0; i < RETRY_COUNT; i++) { - GroupTargetInfo targetInfo = buildGroupTargetInfo(recipients); + GroupTargetInfo targetInfo = buildGroupTargetInfo(recipients); + final GroupTargetInfo targetInfoSnapshot = targetInfo; + Set sharedWith = aciStore.getSenderKeySharedWith(distributionId); List needsSenderKey = targetInfo.destinations.stream() - .filter(a -> !sharedWith.contains(a)) + .filter(a -> !sharedWith.contains(a) || targetInfoSnapshot.sessions.get(a) == null) .map(a -> ServiceId.parseOrThrow(a.getName())) .distinct() .map(SignalServiceAddress::new) diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/crypto/SignalSealedSessionCipher.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/crypto/SignalSealedSessionCipher.java index adbef7558e..8259872d7a 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/crypto/SignalSealedSessionCipher.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/crypto/SignalSealedSessionCipher.java @@ -56,6 +56,11 @@ public class SignalSealedSessionCipher { { try (SignalSessionLock.Lock unused = lock.acquire()) { List recipientSessions = recipients.stream().map(sessionMap::get).collect(Collectors.toList()); + + if (recipientSessions.contains(null)) { + throw new NoSessionException("No session for some recipients"); + } + return cipher.multiRecipientEncrypt(recipients, recipientSessions, content); } }