Loading...
--- xnu/xnu-8020.121.3/libkern/c++/OSArray.cpp
+++ xnu/xnu-8019.80.24/libkern/c++/OSArray.cpp
@@ -64,7 +64,8 @@
return false;
}
- array = kallocp_type_container(ArrayPtrType, &inCapacity, Z_WAITOK_ZERO);
+ array = kalloc_type_tag_bt(ArrayPtrType, inCapacity, Z_WAITOK_ZERO,
+ VM_KERN_MEMORY_LIBKERN);
if (!array) {
return false;
}
@@ -207,7 +208,7 @@
OSArray::ensureCapacity(unsigned int newCapacity)
{
ArraySharedPtrType *newArray;
- unsigned int finalCapacity;
+ vm_size_t finalCapacity;
if (newCapacity <= capacity) {
return capacity;
@@ -222,8 +223,16 @@
return capacity;
}
- newArray = kallocp_type_container(ArrayPtrType, &finalCapacity, Z_WAITOK);
+ newArray = kallocp_type_tag_bt(ArrayPtrType, &finalCapacity,
+ Z_WAITOK, VM_KERN_MEMORY_LIBKERN);
if (newArray) {
+ // use all of the actual allocation size
+ if (finalCapacity > UINT_MAX) {
+ // failure, too large
+ kfree_type(ArrayPtrType, finalCapacity, newArray);
+ return capacity;
+ }
+
OSCONTAINER_ACCUMSIZE(sizeof(*array) * (finalCapacity - capacity));
os::uninitialized_move(array, array + capacity, newArray);
@@ -231,7 +240,7 @@
os::destroy(array, array + capacity);
kfree_type(ArrayPtrType, capacity, array);
array = newArray;
- capacity = finalCapacity;
+ capacity = (unsigned int) finalCapacity;
}
return capacity;