From 74a61037f8fcce5e9e2860898cbb6b79925eb301 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 e046b86b22..d4eab6f24e 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 @@ -2128,10 +2128,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); } }