Skip to content

Commit e443736

Browse files
authored
Merge pull request #1439 from matrix-org/ismail/6023_crashes
Fix some crashes
2 parents 5894488 + 89dbf34 commit e443736

File tree

5 files changed

+58
-19
lines changed

5 files changed

+58
-19
lines changed

MatrixSDK/Categories/MXEvent+Extensions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public extension MXEvent {
3434
if displayNameChecker.isCondition(nil, satisfiedBy: self, roomState: nil, withJsonDict: nil) {
3535
return true
3636
}
37-
guard let rule = session.notificationCenter.rule(matching: self, roomState: nil) else {
37+
guard let rule = session.notificationCenter?.rule(matching: self, roomState: nil) else {
3838
return false
3939
}
4040

MatrixSDK/Crypto/CrossSigning/MXCrossSigning.m

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,9 @@ - (void)requestPrivateKeysToDeviceIds:(nullable NSArray<NSString*>*)deviceIds
325325
// Note: this may never resolve because this depends on other user's devices.
326326
// We could improve it a bit but we will never fix all cases
327327
dispatch_group_t onPrivateKeysReceivedGroup = dispatch_group_create();
328+
__block BOOL secretReceivedForMSK = NO;
329+
__block BOOL secretReceivedForUSK = NO;
330+
__block BOOL secretReceivedForSSK = NO;
328331

329332
__block NSString *mskRequestId, *uskRequestId, *sskRequestId;
330333

@@ -352,7 +355,11 @@ - (void)requestPrivateKeysToDeviceIds:(nullable NSArray<NSString*>*)deviceIds
352355
if (isSecretValid)
353356
{
354357
[self.crypto.store storeSecret:secret withSecretId:MXSecretId.crossSigningMaster];
355-
dispatch_group_leave(onPrivateKeysReceivedGroup);
358+
if (!secretReceivedForMSK)
359+
{
360+
secretReceivedForMSK = YES;
361+
dispatch_group_leave(onPrivateKeysReceivedGroup);
362+
}
356363
}
357364
return isSecretValid;
358365
} failure:^(NSError * _Nonnull error) {
@@ -389,7 +396,11 @@ - (void)requestPrivateKeysToDeviceIds:(nullable NSArray<NSString*>*)deviceIds
389396
if (isSecretValid)
390397
{
391398
[self.crypto.store storeSecret:secret withSecretId:MXSecretId.crossSigningUserSigning];
392-
dispatch_group_leave(onPrivateKeysReceivedGroup);
399+
if (!secretReceivedForUSK)
400+
{
401+
secretReceivedForUSK = YES;
402+
dispatch_group_leave(onPrivateKeysReceivedGroup);
403+
}
393404
}
394405
return isSecretValid;
395406
} failure:^(NSError * _Nonnull error) {
@@ -426,7 +437,11 @@ - (void)requestPrivateKeysToDeviceIds:(nullable NSArray<NSString*>*)deviceIds
426437
if (isSecretValid)
427438
{
428439
[self.crypto.store storeSecret:secret withSecretId:MXSecretId.crossSigningSelfSigning];
429-
dispatch_group_leave(onPrivateKeysReceivedGroup);
440+
if (!secretReceivedForSSK)
441+
{
442+
secretReceivedForSSK = YES;
443+
dispatch_group_leave(onPrivateKeysReceivedGroup);
444+
}
430445
}
431446
return isSecretValid;
432447
} failure:^(NSError * _Nonnull error) {

MatrixSDK/Crypto/Data/Store/MXRealmCryptoStore/MXRealmCryptoStore.m

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ + (BOOL)hasDataForCredentials:(MXCredentials*)credentials
342342
// there is no Realm with this config
343343
return NO;
344344
}
345-
return (nil != [MXRealmOlmAccount objectsInRealm:realm where:@"userId = %@", credentials.userId].firstObject);
345+
return nil != [MXRealmOlmAccount objectInRealm:realm forPrimaryKey:credentials.userId];
346346
}
347347

348348
+ (instancetype)createStoreWithCredentials:(MXCredentials*)credentials
@@ -469,7 +469,7 @@ - (RLMRealm *)realm
469469

470470
- (MXRealmOlmAccount*)accountInCurrentThread
471471
{
472-
return [MXRealmOlmAccount objectsInRealm:self.realm where:@"userId = %@", userId].firstObject;
472+
return [MXRealmOlmAccount objectInRealm:self.realm forPrimaryKey:userId];
473473
}
474474

475475
- (void)open:(void (^)(void))onComplete failure:(void (^)(NSError *error))failure
@@ -564,7 +564,7 @@ - (void)storeDeviceForUser:(NSString*)userID device:(MXDeviceInfo*)device
564564

565565
[realm transactionWithName:@"[MXRealmCryptoStore] storeDeviceForUser" block:^{
566566

567-
MXRealmUser *realmUser = [MXRealmUser objectsInRealm:realm where:@"userId = %@", userID].firstObject;
567+
MXRealmUser *realmUser = [MXRealmUser objectInRealm:realm forPrimaryKey:userID];
568568
if (!realmUser)
569569
{
570570
realmUser = [[MXRealmUser alloc] initWithValue:@{
@@ -596,7 +596,7 @@ - (void)storeDeviceForUser:(NSString*)userID device:(MXDeviceInfo*)device
596596

597597
- (MXDeviceInfo*)deviceWithDeviceId:(NSString*)deviceId forUser:(NSString*)userID
598598
{
599-
MXRealmUser *realmUser = [MXRealmUser objectsInRealm:self.realm where:@"userId = %@", userID].firstObject;
599+
MXRealmUser *realmUser = [MXRealmUser objectInRealm:self.realm forPrimaryKey:userID];
600600

601601
MXRealmDeviceInfo *realmDevice = [[realmUser.devices objectsWhere:@"deviceId = %@", deviceId] firstObject];
602602
if (realmDevice)
@@ -626,7 +626,7 @@ - (void)storeDevicesForUser:(NSString*)userID devices:(NSDictionary<NSString*, M
626626

627627
[realm transactionWithName:@"[MXRealmCryptoStore] storeDevicesForUser" block:^{
628628

629-
MXRealmUser *realmUser = [MXRealmUser objectsInRealm:realm where:@"userId = %@", userID].firstObject;
629+
MXRealmUser *realmUser = [MXRealmUser objectInRealm:realm forPrimaryKey:userID];;
630630
if (!realmUser)
631631
{
632632
realmUser = [[MXRealmUser alloc] initWithValue:@{
@@ -659,7 +659,7 @@ - (void)storeDevicesForUser:(NSString*)userID devices:(NSDictionary<NSString*, M
659659
{
660660
NSMutableDictionary *devicesForUser;
661661

662-
MXRealmUser *realmUser = [MXRealmUser objectsInRealm:self.realm where:@"userId = %@", userID].firstObject;
662+
MXRealmUser *realmUser = [MXRealmUser objectInRealm:self.realm forPrimaryKey:userID];
663663
if (realmUser)
664664
{
665665
devicesForUser = [NSMutableDictionary dictionary];
@@ -697,7 +697,7 @@ - (void)storeCrossSigningKeys:(MXCrossSigningInfo*)crossSigningInfo
697697

698698
[realm transactionWithName:@"[MXRealmCryptoStore] storeCrossSigningKeys" block:^{
699699

700-
MXRealmUser *realmUser = [MXRealmUser objectsInRealm:realm where:@"userId = %@", crossSigningInfo.userId].firstObject;
700+
MXRealmUser *realmUser = [MXRealmUser objectInRealm:realm forPrimaryKey:crossSigningInfo.userId];
701701
if (!realmUser)
702702
{
703703
realmUser = [[MXRealmUser alloc] initWithValue:@{
@@ -724,7 +724,7 @@ - (MXCrossSigningInfo*)crossSigningKeysForUser:(NSString*)userId
724724
{
725725
MXCrossSigningInfo *crossSigningKeys;
726726

727-
MXRealmUser *realmUser = [MXRealmUser objectsInRealm:self.realm where:@"userId = %@", userId].firstObject;
727+
MXRealmUser *realmUser = [MXRealmUser objectInRealm:self.realm forPrimaryKey:userId];
728728
if (realmUser)
729729
{
730730
crossSigningKeys = [NSKeyedUnarchiver unarchiveObjectWithData:realmUser.crossSigningKeys.data];
@@ -816,7 +816,7 @@ - (BOOL)blacklistUnverifiedDevicesInRoom:(NSString *)roomId
816816

817817
- (MXRealmRoomAlgorithm *)realmRoomAlgorithmForRoom:(NSString*)roomId inRealm:(RLMRealm*)realm
818818
{
819-
return [MXRealmRoomAlgorithm objectsInRealm:realm where:@"roomId = %@", roomId].firstObject;
819+
return [MXRealmRoomAlgorithm objectInRealm:realm forPrimaryKey:roomId];
820820
}
821821

822822

@@ -1052,7 +1052,7 @@ - (MXOlmOutboundGroupSession *)storeOutboundGroupSession:(OLMOutboundGroupSessio
10521052
RLMRealm *realm = self.realm;
10531053
[realm transactionWithName:@"[MXRealmCryptoStore] storeOutboundGroupSession" block:^{
10541054

1055-
MXRealmOlmOutboundGroupSession *realmSession = [MXRealmOlmOutboundGroupSession objectsInRealm:realm where:@"roomId = %@", roomId].firstObject;
1055+
MXRealmOlmOutboundGroupSession *realmSession = [MXRealmOlmOutboundGroupSession objectInRealm:realm forPrimaryKey:roomId];
10561056
if (realmSession && [realmSession.sessionId isEqual:session.sessionIdentifier])
10571057
{
10581058
// Update the existing one
@@ -1089,7 +1089,7 @@ - (MXOlmOutboundGroupSession *)storeOutboundGroupSession:(OLMOutboundGroupSessio
10891089
- (MXOlmOutboundGroupSession *)outboundGroupSessionWithRoomId:(NSString*)roomId
10901090
{
10911091
OLMOutboundGroupSession *session;
1092-
MXRealmOlmOutboundGroupSession *realmSession = [MXRealmOlmOutboundGroupSession objectsInRealm:self.realm where:@"roomId = %@", roomId].firstObject;
1092+
MXRealmOlmOutboundGroupSession *realmSession = [MXRealmOlmOutboundGroupSession objectInRealm:self.realm forPrimaryKey:roomId];
10931093

10941094
MXLogDebug(@"[MXRealmCryptoStore] outboundGroupSessionWithRoomId: %@ -> %@", roomId, realmSession ? @"found" : @"not found");
10951095

@@ -1151,7 +1151,7 @@ - (void)storeSharedDevices:(MXUsersDevicesMap<NSNumber *> *)devices messageIndex
11511151
{
11521152
for (NSString *deviceId in [devices deviceIdsForUser:userId])
11531153
{
1154-
MXRealmUser *realmUser = [MXRealmUser objectsInRealm:realm where:@"userId = %@", userId].firstObject;
1154+
MXRealmUser *realmUser = [MXRealmUser objectInRealm:realm forPrimaryKey:userId];
11551155
if (!realmUser)
11561156
{
11571157
MXLogDebug(@"[MXRealmCryptoStore] storeSharedDevices cannot find user with the ID %@", userId);

MatrixSDK/Utils/MXUIKitBackgroundModeHandler.m

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,23 @@ - (instancetype)initWithApplicationBlock:(MXApplicationGetterBlock)applicationBl
7979
return self;
8080
}
8181

82+
+ (NSLock *)reusableTasksReadWriteLock {
83+
static NSLock *lock;
84+
85+
static dispatch_once_t onceToken;
86+
dispatch_once(&onceToken, ^{
87+
lock = [[NSLock alloc] init];
88+
});
89+
return lock;
90+
}
91+
92+
- (void)accessReusableTasksWithBlock:(void(^)(void))block
93+
{
94+
[[self.class reusableTasksReadWriteLock] lock];
95+
block();
96+
[[self.class reusableTasksReadWriteLock] unlock];
97+
}
98+
8299

83100
#pragma mark - MXBackgroundModeHandler
84101

@@ -120,7 +137,9 @@ - (instancetype)initWithApplicationBlock:(MXApplicationGetterBlock)applicationBl
120137
if (reusable)
121138
{
122139
// first look in the cache
123-
backgroundTask = [self.reusableTasks objectForKey:name];
140+
[self accessReusableTasksWithBlock:^{
141+
backgroundTask = [self.reusableTasks objectForKey:name];
142+
}];
124143

125144
// create if not found or not running
126145
// According to the documentation, a weak-values map table doesn't have to remove objects immediately when they are released, so also check the running state of the task.
@@ -131,7 +150,9 @@ - (instancetype)initWithApplicationBlock:(MXApplicationGetterBlock)applicationBl
131150
MXStrongifyAndReturnIfNil(self);
132151

133152
// remove when expired
134-
[self.reusableTasks removeObjectForKey:task.name];
153+
[self accessReusableTasksWithBlock:^{
154+
[self.reusableTasks removeObjectForKey:task.name];
155+
}];
135156

136157
if (expirationHandler)
137158
{
@@ -143,7 +164,9 @@ - (instancetype)initWithApplicationBlock:(MXApplicationGetterBlock)applicationBl
143164
// cache the task if successfully created
144165
if (backgroundTask)
145166
{
146-
[self.reusableTasks setObject:backgroundTask forKey:name];
167+
[self accessReusableTasksWithBlock:^{
168+
[self.reusableTasks setObject:backgroundTask forKey:name];
169+
}];
147170
}
148171
}
149172
else

changelog.d/6023.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
MatrixSDK: Fix some crashes after 1.8.10.

0 commit comments

Comments
 (0)