From 6e19c1aae88357bbc04304ae494849c42b60542e Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Mon, 24 Jul 2017 10:35:18 -0400 Subject: [PATCH] Don't crash when messaging user with malformed profile // FREEBIE --- .../src/Messages/OWSMessageSender.m | 4 ++-- .../src/Messages/PreKeyBundle+jsonDict.h | 12 +++++----- .../src/Messages/PreKeyBundle+jsonDict.m | 22 ++++++++++++++----- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 0e26cc45e..1ac44d17a 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1212,8 +1212,8 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; { if (![storage containsSession:identifier deviceId:[deviceNumber intValue]]) { __block dispatch_semaphore_t sema = dispatch_semaphore_create(0); - __block PreKeyBundle *bundle; - __block NSException *exception; + __block PreKeyBundle *_Nullable bundle; + __block NSException *_Nullable exception; [self.networkManager makeRequest:[[TSRecipientPrekeyRequest alloc] initWithRecipient:identifier deviceId:[deviceNumber stringValue]] success:^(NSURLSessionDataTask *task, id responseObject) { diff --git a/SignalServiceKit/src/Messages/PreKeyBundle+jsonDict.h b/SignalServiceKit/src/Messages/PreKeyBundle+jsonDict.h index 030166085..37729e50f 100644 --- a/SignalServiceKit/src/Messages/PreKeyBundle+jsonDict.h +++ b/SignalServiceKit/src/Messages/PreKeyBundle+jsonDict.h @@ -1,15 +1,15 @@ // -// PreKeyBundle+jsonDict.h -// Signal -// -// Created by Frederic Jacobs on 26/11/14. -// Copyright (c) 2014 Open Whisper Systems. All rights reserved. +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // #import "PreKeyBundle.h" +NS_ASSUME_NONNULL_BEGIN + @interface PreKeyBundle (jsonDict) -+ (PreKeyBundle *)preKeyBundleFromDictionary:(NSDictionary *)dictionary forDeviceNumber:(NSNumber *)number; ++ (nullable PreKeyBundle *)preKeyBundleFromDictionary:(NSDictionary *)dictionary forDeviceNumber:(NSNumber *)number; @end + +NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/PreKeyBundle+jsonDict.m b/SignalServiceKit/src/Messages/PreKeyBundle+jsonDict.m index 8984c34e5..b6d6089ca 100644 --- a/SignalServiceKit/src/Messages/PreKeyBundle+jsonDict.m +++ b/SignalServiceKit/src/Messages/PreKeyBundle+jsonDict.m @@ -5,17 +5,27 @@ #import "NSData+Base64.h" #import "PreKeyBundle+jsonDict.h" +NS_ASSUME_NONNULL_BEGIN + @implementation PreKeyBundle (jsonDict) -+ (PreKeyBundle *)preKeyBundleFromDictionary:(NSDictionary *)dictionary forDeviceNumber:(NSNumber *)number { ++ (nullable PreKeyBundle *)preKeyBundleFromDictionary:(NSDictionary *)dictionary forDeviceNumber:(NSNumber *)number +{ PreKeyBundle *bundle = nil; - NSString *identityKeyString = [dictionary objectForKey:@"identityKey"]; - NSArray *devicesArray = [dictionary objectForKey:@"devices"]; - if (!(identityKeyString && [devicesArray isKindOfClass:[NSArray class]])) { - DDLogError(@"Failed to get identity key or messages array from server request"); + id identityKeyObject = [dictionary objectForKey:@"identityKey"]; + if (![identityKeyObject isKindOfClass:[NSString class]]) { + OWSFail(@"Unexpected identityKeyObject: %@", identityKeyObject); + return nil; + } + NSString *identityKeyString = (NSString *)identityKeyObject; + + id devicesObject = [dictionary objectForKey:@"devices"]; + if (![devicesObject isKindOfClass:[NSArray class]]) { + OWSFail(@"Unexpected devicesObject: %@", devicesObject); return nil; } + NSArray *devicesArray = (NSArray *)devicesObject; NSData *identityKey = [NSData dataFromBase64StringNoPadding:identityKeyString]; @@ -108,3 +118,5 @@ } @end + +NS_ASSUME_NONNULL_END