Loading...
--- xnu/xnu-8020.121.3/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,7 +66,8 @@
return false;
}
- array = kallocp_type_container(ArrayPtrType, &inCapacity, Z_WAITOK_ZERO);
+ size = sizeof(*array) * inCapacity;
+ array = (ArraySharedPtrType *)kalloc_container(size);
if (!array) {
return false;
}
@@ -74,7 +77,7 @@
capacityIncrement = (inCapacity)? inCapacity : 16;
os::uninitialized_value_construct(array, array + capacity);
- OSCONTAINER_ACCUMSIZE(sizeof(*array) * inCapacity);
+ OSCONTAINER_ACCUMSIZE(size);
return true;
}
@@ -172,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));
}
@@ -207,7 +210,8 @@
OSArray::ensureCapacity(unsigned int newCapacity)
{
ArraySharedPtrType *newArray;
- unsigned int finalCapacity;
+ vm_size_t finalCapacity;
+ vm_size_t oldSize, newSize;
if (newCapacity <= capacity) {
return capacity;
@@ -222,16 +226,28 @@
return capacity;
}
- newArray = kallocp_type_container(ArrayPtrType, &finalCapacity, Z_WAITOK);
+ newSize = sizeof(*newArray) * finalCapacity;
+
+ newArray = (decltype(newArray))kallocp_container(&newSize);
if (newArray) {
- OSCONTAINER_ACCUMSIZE(sizeof(*array) * (finalCapacity - capacity));
+ // use all of the actual allocation size
+ finalCapacity = (newSize / sizeof(*newArray));
+ if (finalCapacity > UINT_MAX) {
+ // failure, too large
+ kfree(newArray, newSize);
+ return 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 = finalCapacity;
+ capacity = (unsigned int) finalCapacity;
}
return capacity;