Loading...
libkern/c++/OSArray.cpp xnu-8019.80.24 xnu-7195.141.2
--- xnu/xnu-8019.80.24/libkern/c++/OSArray.cpp
+++ xnu/xnu-7195.141.2/libkern/c++/OSArray.cpp
@@ -55,6 +55,8 @@
 bool
 OSArray::initWithCapacity(unsigned int inCapacity)
 {
+	unsigned int size;
+
 	if (!super::init()) {
 		return false;
 	}
@@ -64,8 +66,8 @@
 		return false;
 	}
 
-	array = kalloc_type_tag_bt(ArrayPtrType, inCapacity, Z_WAITOK_ZERO,
-	    VM_KERN_MEMORY_LIBKERN);
+	size = sizeof(*array) * inCapacity;
+	array = (ArraySharedPtrType *)kalloc_container(size);
 	if (!array) {
 		return false;
 	}
@@ -75,7 +77,7 @@
 	capacityIncrement = (inCapacity)? inCapacity : 16;
 
 	os::uninitialized_value_construct(array, array + capacity);
-	OSCONTAINER_ACCUMSIZE(sizeof(*array) * inCapacity);
+	OSCONTAINER_ACCUMSIZE(size);
 
 	return true;
 }
@@ -173,7 +175,7 @@
 
 	if (array) {
 		os::destroy(array, array + capacity);
-		kfree_type(ArrayPtrType, capacity, array);
+		kfree(array, sizeof(*array) * capacity);
 		OSCONTAINER_ACCUMSIZE( -(sizeof(*array) * capacity));
 	}
 
@@ -209,6 +211,7 @@
 {
 	ArraySharedPtrType *newArray;
 	vm_size_t    finalCapacity;
+	vm_size_t    oldSize, newSize;
 
 	if (newCapacity <= capacity) {
 		return capacity;
@@ -223,22 +226,26 @@
 		return capacity;
 	}
 
-	newArray = kallocp_type_tag_bt(ArrayPtrType, &finalCapacity,
-	    Z_WAITOK, VM_KERN_MEMORY_LIBKERN);
+	newSize = sizeof(*newArray) * finalCapacity;
+
+	newArray = (decltype(newArray))kallocp_container(&newSize);
 	if (newArray) {
 		// use all of the actual allocation size
+		finalCapacity = (newSize / sizeof(*newArray));
 		if (finalCapacity > UINT_MAX) {
 			// failure, too large
-			kfree_type(ArrayPtrType, finalCapacity, newArray);
+			kfree(newArray, newSize);
 			return capacity;
 		}
 
-		OSCONTAINER_ACCUMSIZE(sizeof(*array) * (finalCapacity - capacity));
+		oldSize = sizeof(*array) * capacity;
+
+		OSCONTAINER_ACCUMSIZE(((size_t)newSize) - ((size_t)oldSize));
 
 		os::uninitialized_move(array, array + capacity, newArray);
 		os::uninitialized_value_construct(newArray + capacity, newArray + finalCapacity);
 		os::destroy(array, array + capacity);
-		kfree_type(ArrayPtrType, capacity, array);
+		kfree(array, oldSize);
 		array = newArray;
 		capacity = (unsigned int) finalCapacity;
 	}