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

Make FLEXClassIsSafe return NO for unknown root classes

Tanner Bennett лет назад: 6
Родитель
Сommit
ca005fb4d0
1 измененных файлов с 20 добавлено и 3 удалено
  1. 20 3
      Classes/Utility/Runtime/Objc/FLEXRuntimeSafety.h

+ 20 - 3
Classes/Utility/Runtime/Objc/FLEXRuntimeSafety.h

@@ -15,10 +15,27 @@ extern const Class * FLEXKnownUnsafeClassList(void);
 extern NSSet * FLEXKnownUnsafeClassNames(void);
 extern CFSetRef FLEXKnownUnsafeClasses;
 
-static inline BOOL FLEXClassIsSafe(Class cls) {
-    if (!cls) return NO;
+static Class cNSObject = nil, cNSProxy = nil;
+
+__attribute__((constructor))
+static void FLEXInitKnownRootClasses() {
+    cNSObject = [NSObject class];
+    cNSProxy = [NSProxy class];
+}
 
-    return !CFSetContainsValue(FLEXKnownUnsafeClasses, (__bridge void *)cls);
+static inline BOOL FLEXClassIsSafe(Class cls) {
+    // Is it nil or known to be unsafe?
+    if (!cls || CFSetContainsValue(FLEXKnownUnsafeClasses, (__bridge void *)cls)) {
+        return NO;
+    }
+    
+    // Is it a known root class?
+    if (!class_getSuperclass(cls)) {
+        return cls == cNSObject || cls == cNSProxy;
+    }
+    
+    // Probably safe
+    return YES;
 }
 
 static inline BOOL FLEXClassNameIsSafe(NSString *cls) {