@@ -472,13 +472,10 @@ objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes) { struct objc_class *class, *metaclass; Class iter, rootclass = Nil; - if (extraBytes > LONG_MAX) - OBJC_ERROR("extraBytes out of range!"); - if ((class = calloc(1, sizeof(*class))) == NULL || (metaclass = calloc(1, sizeof(*class))) == NULL) OBJC_ERROR("Not enough memory to allocate class pair for class " "%s!", name); @@ -485,11 +482,17 @@ class->isa = metaclass; class->superclass = superclass; class->name = name; class->info = OBJC_CLASS_INFO_CLASS; class->instanceSize = (superclass != Nil ? - superclass->instanceSize : 0) + (long)extraBytes; + superclass->instanceSize : 0); + + if (extraBytes > LONG_MAX || + LONG_MAX - class->instanceSize < (long)extraBytes) + OBJC_ERROR("extraBytes too large!"); + + class->instanceSize += (long)extraBytes; for (iter = superclass; iter != Nil; iter = iter->superclass) rootclass = iter; metaclass->isa = (rootclass != Nil ? rootclass->isa : class); @@ -629,11 +632,12 @@ if ((ret = malloc((classesCount + 1) * sizeof(Class))) == NULL) OBJC_ERROR("Failed to allocate memory for class list!"); count = objc_getClassList(ret, classesCount); - OFEnsure(count == classesCount); + if (count != classesCount) + OBJC_ERROR("Fatal internal inconsistency!"); ret[count] = Nil; if (length != NULL) *length = count; @@ -978,11 +982,12 @@ */ i = UINT32_MAX; } } - OFEnsure(classesCount == 0); + if (classesCount != 0) + OBJC_ERROR("Fatal internal inconsistency!"); if (emptyDTable != NULL) { objc_dtable_free(emptyDTable); emptyDTable = NULL; }