Loading...
libkern/c++/OSOrderedSet.cpp xnu-12377.101.15 xnu-8019.80.24
--- xnu/xnu-12377.101.15/libkern/c++/OSOrderedSet.cpp
+++ xnu/xnu-8019.80.24/libkern/c++/OSOrderedSet.cpp
@@ -67,7 +67,8 @@
 		return false;
 	}
 
-	array = kallocp_type_container(_Element, &inCapacity, Z_WAITOK_ZERO);
+	array = kalloc_type_tag_bt(_Element, inCapacity, Z_WAITOK_ZERO,
+	    VM_KERN_MEMORY_LIBKERN);
 	if (!array) {
 		return false;
 	}
@@ -160,7 +161,7 @@
 OSOrderedSet::ensureCapacity(unsigned int newCapacity)
 {
 	_Element *newArray;
-	unsigned int finalCapacity;
+	vm_size_t finalCapacity;
 
 	if (newCapacity <= capacity) {
 		return capacity;
@@ -173,12 +174,22 @@
 		return capacity;
 	}
 
-	newArray = kreallocp_type_container(_Element, array,
-	    capacity, &finalCapacity, Z_WAITOK_ZERO);
+	newArray = kallocp_type_tag_bt(_Element, &finalCapacity, Z_WAITOK_ZERO,
+	    VM_KERN_MEMORY_LIBKERN);
 	if (newArray) {
+		// use all of the actual allocation size
+		if (finalCapacity > UINT_MAX) {
+			// failure, too large
+			kfree_type(_Element, finalCapacity, newArray);
+			return capacity;
+		}
+
 		OSCONTAINER_ACCUMSIZE(sizeof(_Element) * (finalCapacity - capacity));
+
+		bcopy(array, newArray, capacity * sizeof(_Element));
+		kfree_type(_Element, capacity, array);
 		array = newArray;
-		capacity = finalCapacity;
+		capacity = (unsigned int) finalCapacity;
 	}
 
 	return capacity;