Просмотр исходного кода

Exclude unsafe ivars from evaluation

Tanner Bennett лет назад: 6
Родитель
Сommit
7481f7e098

+ 5 - 0
Classes/Utility/Runtime/FLEXIvar.m

@@ -9,6 +9,7 @@
 
 
 #import "FLEXIvar.h"
 #import "FLEXIvar.h"
 #import "FLEXRuntimeUtility.h"
 #import "FLEXRuntimeUtility.h"
+#import "FLEXRuntimeSafety.h"
 
 
 @interface FLEXIvar () {
 @interface FLEXIvar () {
     NSString *_flex_description;
     NSString *_flex_description;
@@ -82,6 +83,10 @@
 
 
 - (id)getValue:(id)target {
 - (id)getValue:(id)target {
     id value = nil;
     id value = nil;
+    if (!FLEXIvarIsSafe(_objc_ivar)) {
+        return nil;
+    }
+
 #ifdef __arm64__
 #ifdef __arm64__
     // See http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html
     // See http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html
     if (self.type == FLEXTypeEncodingObjcClass && [self.name isEqualToString:@"isa"]) {
     if (self.type == FLEXTypeEncodingObjcClass && [self.name isEqualToString:@"isa"]) {

+ 13 - 1
Classes/Utility/Runtime/FLEXRuntimeSafety.h

@@ -6,7 +6,9 @@
 //
 //
 
 
 #import <Foundation/Foundation.h>
 #import <Foundation/Foundation.h>
+#import <objc/runtime.h>
 
 
+#pragma mark - Classes
 
 
 extern NSUInteger const kFLEXKnownUnsafeClassCount;
 extern NSUInteger const kFLEXKnownUnsafeClassCount;
 extern const Class * FLEXKnownUnsafeClassList();
 extern const Class * FLEXKnownUnsafeClassList();
@@ -16,7 +18,7 @@ extern CFSetRef FLEXKnownUnsafeClasses;
 static inline BOOL FLEXClassIsSafe(Class cls) {
 static inline BOOL FLEXClassIsSafe(Class cls) {
     if (!cls) return NO;
     if (!cls) return NO;
 
 
-    return CFSetContainsValue(FLEXKnownUnsafeClasses, (__bridge void *)cls);
+    return !CFSetContainsValue(FLEXKnownUnsafeClasses, (__bridge void *)cls);
 }
 }
 
 
 static inline BOOL FLEXClassNameIsSafe(NSString *cls) {
 static inline BOOL FLEXClassNameIsSafe(NSString *cls) {
@@ -25,3 +27,13 @@ static inline BOOL FLEXClassNameIsSafe(NSString *cls) {
     NSSet *ignored = FLEXKnownUnsafeClassNames();
     NSSet *ignored = FLEXKnownUnsafeClassNames();
     return ![ignored containsObject:cls];
     return ![ignored containsObject:cls];
 }
 }
+
+#pragma mark - Ivars
+
+extern CFSetRef FLEXKnownUnsafeIvars;
+
+static inline BOOL FLEXIvarIsSafe(Ivar ivar) {
+    if (!ivar) return NO;
+
+    return !CFSetContainsValue(FLEXKnownUnsafeIvars, ivar);
+}

+ 15 - 0
Classes/Utility/Runtime/FLEXRuntimeSafety.m

@@ -10,10 +10,14 @@
 NSUInteger const kFLEXKnownUnsafeClassCount = 19;
 NSUInteger const kFLEXKnownUnsafeClassCount = 19;
 Class * _UnsafeClasses = NULL;
 Class * _UnsafeClasses = NULL;
 CFSetRef FLEXKnownUnsafeClasses = nil;
 CFSetRef FLEXKnownUnsafeClasses = nil;
+CFSetRef FLEXKnownUnsafeIvars = nil;
 
 
 #define FLEXClassPointerOrCFNull(name) \
 #define FLEXClassPointerOrCFNull(name) \
     (NSClassFromString(name) ?: (__bridge id)kCFNull)
     (NSClassFromString(name) ?: (__bridge id)kCFNull)
 
 
+#define FLEXIvarOrCFNull(cls, name) \
+    (class_getInstanceVariable([cls class], name) ?: (void *)kCFNull)
+
 __attribute__((constructor))
 __attribute__((constructor))
 void FLEXRuntimeSafteyInit() {
 void FLEXRuntimeSafteyInit() {
     FLEXKnownUnsafeClasses = CFSetCreate(
     FLEXKnownUnsafeClasses = CFSetCreate(
@@ -22,6 +26,17 @@ void FLEXRuntimeSafteyInit() {
         kFLEXKnownUnsafeClassCount,
         kFLEXKnownUnsafeClassCount,
         nil
         nil
     );
     );
+
+    Ivar unsafeIvars[] = {
+        FLEXIvarOrCFNull(NSURL, "_urlString"),
+        FLEXIvarOrCFNull(NSURL, "_baseURL"),
+    };
+    FLEXKnownUnsafeIvars = CFSetCreate(
+        kCFAllocatorDefault,
+        (const void **)unsafeIvars,
+        sizeof(unsafeIvars),
+        nil
+    );
 }
 }
 
 
 const Class * FLEXKnownUnsafeClassList() {
 const Class * FLEXKnownUnsafeClassList() {