Skip to content

Commit a384e62

Browse files
authored
[Crashlytics] Add attribute for Info.plist to manually force back to mach exception default behavior (#15735)
1 parent 5125d5c commit a384e62

12 files changed

+77
-10
lines changed

Crashlytics/Crashlytics/Components/FIRCLSContext.m

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
initData.previouslyCrashedFileRootPath = [fileManager rootPath];
6666
initData.errorsEnabled = [settings errorReportingEnabled];
6767
initData.customExceptionsEnabled = [settings customExceptionsEnabled];
68+
initData.machExceptionDefaultBehavior = [settings machExceptionDefaultBehavior];
6869
initData.maxCustomExceptions = [settings maxCustomExceptions];
6970
initData.maxErrorLogSize = [settings errorLogBufferSize];
7071
initData.maxLogSize = [settings logBufferSize];
@@ -190,7 +191,9 @@
190191
// TODO: remove EXCEPTION_DEFAULT support when we bump min MacOS support to 12+
191192
_firclsContext.readonly->machException.behavior = EXCEPTION_DEFAULT;
192193
if (@available(macOS 12, *)) {
193-
_firclsContext.readonly->machException.behavior = EXCEPTION_IDENTITY_PROTECTED;
194+
if (!initData.machExceptionDefaultBehavior) {
195+
_firclsContext.readonly->machException.behavior = EXCEPTION_IDENTITY_PROTECTED;
196+
}
194197
}
195198
FIRCLSMachExceptionInit(&_firclsContext.readonly->machException);
196199
});

Crashlytics/Crashlytics/FIRCrashlytics.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ - (instancetype)initWithApp:(FIRApp *)app
150150

151151
FIRCLSApplicationIdentifierModel *appModel = [[FIRCLSApplicationIdentifierModel alloc] init];
152152
FIRCLSSettings *settings = [[FIRCLSSettings alloc] initWithFileManager:_fileManager
153-
appIDModel:appModel];
153+
appIDModel:appModel
154+
appInfo:appInfo];
154155

155156
FIRCLSOnDemandModel *onDemandModel =
156157
[[FIRCLSOnDemandModel alloc] initWithFIRCLSSettings:settings fileManager:_fileManager];

Crashlytics/Crashlytics/Helpers/FIRCLSContextInitData.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ NS_ASSUME_NONNULL_BEGIN
2828
@property(nonatomic, copy) NSString* betaToken;
2929
@property(nonatomic) BOOL errorsEnabled;
3030
@property(nonatomic) BOOL customExceptionsEnabled;
31+
@property(nonatomic) BOOL machExceptionDefaultBehavior;
3132
@property(nonatomic) uint32_t maxCustomExceptions;
3233
@property(nonatomic) uint32_t maxErrorLogSize;
3334
@property(nonatomic) uint32_t maxLogSize;

Crashlytics/Crashlytics/Models/FIRCLSSettings.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ NS_ASSUME_NONNULL_BEGIN
3030
- (instancetype)init NS_UNAVAILABLE;
3131
+ (instancetype)new NS_UNAVAILABLE;
3232
- (instancetype)initWithFileManager:(FIRCLSFileManager *)fileManager
33-
appIDModel:(FIRCLSApplicationIdentifierModel *)appIDModel;
33+
appIDModel:(FIRCLSApplicationIdentifierModel *)appIDModel
34+
appInfo:(NSDictionary *)appInfo;
3435

3536
/**
3637
* Recreates the settings dictionary by re-reading the settings file from persistent storage. This
@@ -78,6 +79,12 @@ NS_ASSUME_NONNULL_BEGIN
7879
*/
7980
@property(nonatomic, readonly) BOOL customExceptionsEnabled;
8081

82+
/**
83+
* When this is true, Crashlytics will fallback to EXCEPTION_DEFAULT
84+
* for mach exception handler instead of EXCEPTION_IDENTITY_PROTECTED
85+
*/
86+
@property(nonatomic) BOOL machExceptionDefaultBehavior;
87+
8188
/**
8289
* When this is true, Crashlytics will collect data from MetricKit
8390
*/

Crashlytics/Crashlytics/Models/FIRCLSSettings.m

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
NSString *const GoogleAppIDKey = @"google_app_id";
3131
NSString *const BuildInstanceID = @"build_instance_id";
3232
NSString *const AppVersion = @"app_version";
33+
NSString *const FirebaseCrashlyticsMachDefaultBehaviorKey =
34+
@"FirebaseCrashlyticsMachDefaultBehavior";
3335

3436
@interface FIRCLSSettings ()
3537

@@ -47,21 +49,34 @@ @interface FIRCLSSettings ()
4749
@implementation FIRCLSSettings
4850

4951
- (instancetype)initWithFileManager:(FIRCLSFileManager *)fileManager
50-
appIDModel:(FIRCLSApplicationIdentifierModel *)appIDModel {
52+
appIDModel:(FIRCLSApplicationIdentifierModel *)appIDModel
53+
appInfo:(NSDictionary *)appInfo {
5154
return
5255
[self initWithFileManager:fileManager
5356
appIDModel:appIDModel
57+
appInfo:appInfo
5458
deletionQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)];
5559
}
5660

5761
- (instancetype)initWithFileManager:(FIRCLSFileManager *)fileManager
5862
appIDModel:(FIRCLSApplicationIdentifierModel *)appIDModel
63+
appInfo:(NSDictionary *)appInfo
5964
deletionQueue:(dispatch_queue_t)deletionQueue {
6065
self = [super init];
6166
if (!self) {
6267
return nil;
6368
}
6469

70+
// Configure the Mach exception message receiving behavior from Info.plist the mach exception
71+
// message receiving behavior
72+
self.machExceptionDefaultBehavior = false;
73+
id crashlyticsMachDefaultBehavior =
74+
[appInfo objectForKey:FirebaseCrashlyticsMachDefaultBehaviorKey];
75+
if ([crashlyticsMachDefaultBehavior isKindOfClass:[NSString class]] ||
76+
[crashlyticsMachDefaultBehavior isKindOfClass:[NSNumber class]]) {
77+
self.machExceptionDefaultBehavior = [crashlyticsMachDefaultBehavior boolValue];
78+
}
79+
6580
_fileManager = fileManager;
6681
_appIDModel = appIDModel;
6782

Crashlytics/UnitTests/FIRCLSContextManagerTests.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ - (void)setUp {
4747

4848
FIRCLSApplicationIdentifierModel *appIDModel = [[FIRCLSApplicationIdentifierModel alloc] init];
4949
_mockSettings = [[FIRCLSMockSettings alloc] initWithFileManager:self.fileManager
50-
appIDModel:appIDModel];
50+
appIDModel:appIDModel
51+
appInfo:[[NSDictionary alloc] init]];
5152

5253
// NSString *name = @"exception_model_report";
5354
NSString *reportPath =

Crashlytics/UnitTests/FIRCLSMetricKitManagerTests.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ - (void)setUp {
9292
[[FIRMockGDTCORTransport alloc] initWithMappingID:@"id" transformers:nil target:0];
9393
FIRCLSApplicationIdentifierModel *appIDModel = [[FIRCLSApplicationIdentifierModel alloc] init];
9494
FIRCLSMockSettings *mockSettings =
95-
[[FIRCLSMockSettings alloc] initWithFileManager:self.fileManager appIDModel:appIDModel];
95+
[[FIRCLSMockSettings alloc] initWithFileManager:self.fileManager
96+
appIDModel:appIDModel
97+
appInfo:[[NSDictionary alloc] init]];
9698

9799
// Allow nil values only in tests
98100
#pragma clang diagnostic push

Crashlytics/UnitTests/FIRCLSOnDemandModelTests.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ - (void)setUp {
6262

6363
FIRCLSApplicationIdentifierModel *appIDModel = [[FIRCLSApplicationIdentifierModel alloc] init];
6464
_mockSettings = [[FIRCLSMockSettings alloc] initWithFileManager:self.fileManager
65-
appIDModel:appIDModel];
65+
appIDModel:appIDModel
66+
appInfo:[[NSDictionary alloc] init]];
6667
_onDemandModel = [[FIRCLSMockOnDemandModel alloc] initWithFIRCLSSettings:_mockSettings
6768
fileManager:_fileManager
6869
sleepBlock:^(int delay){

Crashlytics/UnitTests/FIRCLSReportManagerTests.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ - (void)setUp {
9494
[[FIRMockGDTCORTransport alloc] initWithMappingID:@"id" transformers:nil target:0];
9595
self.appIDModel = [[FIRCLSApplicationIdentifierModel alloc] init];
9696
self.mockSettings = [[FIRCLSMockSettings alloc] initWithFileManager:self.fileManager
97-
appIDModel:self.appIDModel];
97+
appIDModel:self.appIDModel
98+
appInfo:[[NSDictionary alloc] init]];
9899

99100
// Allow nil values only in tests
100101
#pragma clang diagnostic push

Crashlytics/UnitTests/FIRCLSReportUploaderTests.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ - (void)setUp {
5858
FABMockApplicationIdentifierModel *appIDModel = [[FABMockApplicationIdentifierModel alloc] init];
5959
self.queue = [NSOperationQueue new];
6060
self.mockSettings = [[FIRCLSMockSettings alloc] initWithFileManager:self.fileManager
61-
appIDModel:appIDModel];
61+
appIDModel:appIDModel
62+
appInfo:[[NSDictionary alloc] init]];
6263
self.mockDataTransport = [[FIRMockGDTCORTransport alloc] initWithMappingID:@"1206"
6364
transformers:nil
6465
target:kGDTCORTargetCSH];

0 commit comments

Comments
 (0)