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

Fix FLEXPointerIsValidObjcObject sometimes failing

We now check if the class returned from object_getClass is readable because object_getClass can return a garbage value when given a non-nil pointer to a non-object
Tanner Bennett лет назад: 7
Родитель
Сommit
70264c1cd5
1 измененных файлов с 7 добавлено и 4 удалено
  1. 7 4
      Classes/Utility/FLEXObjcInternal.mm

+ 7 - 4
Classes/Utility/FLEXObjcInternal.mm

@@ -176,12 +176,15 @@ BOOL FLEXPointerIsValidObjcObject(const void *ptr)
         return NO;
     }
 
-    // http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html :
-    if (!object_getClass((__bridge id)ptr)) {
-        return NO;
+    // http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html
+    // We check if the returned class is readable because object_getClass
+    // can return a garbage value when given a non-nil pointer to a non-object
+    Class cls = object_getClass((__bridge id)ptr);
+    if (cls && FLEXPointerIsReadable((__bridge void *)cls) && object_isClass(cls)) {
+        return YES;
     }
 
-    return YES;
+    return NO;
 }