Loading...
libkern/c++/OSDictionary.cpp xnu-3248.50.21 xnu-3789.51.2
--- xnu/xnu-3248.50.21/libkern/c++/OSDictionary.cpp
+++ xnu/xnu-3789.51.2/libkern/c++/OSDictionary.cpp
@@ -269,7 +269,8 @@
 unsigned int OSDictionary::ensureCapacity(unsigned int newCapacity)
 {
     dictEntry *newDict;
-    unsigned int finalCapacity, oldSize, newSize;
+    unsigned int finalCapacity;
+    vm_size_t oldSize, newSize;
 
     if (newCapacity <= capacity)
         return capacity;
@@ -284,8 +285,11 @@
     
     newSize = sizeof(dictEntry) * finalCapacity;
 
-    newDict = (dictEntry *) kalloc_container(newSize);
+    newDict = (dictEntry *) kallocp_container(&newSize);
     if (newDict) {
+        // use all of the actual allocation size
+        finalCapacity = newSize / sizeof(dictEntry);
+
         oldSize = sizeof(dictEntry) * capacity;
 
         bcopy(dictionary, newDict, oldSize);
@@ -701,3 +705,21 @@
     return ret;
 }
 
+OSArray * OSDictionary::copyKeys(void)
+{
+    OSArray * array;
+
+	array = OSArray::withCapacity(count);
+	if (!array) return (0);
+
+	for (unsigned int i = 0; i < count; i++)
+	{
+	    if (!array->setObject(i, dictionary[i].key))
+	    {
+            array->release();
+            array = 0;
+            break;
+        }
+	}
+    return (array);
+}