Loading...
libkern/c++/OSDictionary.cpp xnu-12377.101.15 xnu-8020.121.3
--- xnu/xnu-12377.101.15/libkern/c++/OSDictionary.cpp
+++ xnu/xnu-8020.121.3/libkern/c++/OSDictionary.cpp
@@ -98,6 +98,7 @@
 		return false;
 	}
 
+	os::uninitialized_value_construct(dictionary, dictionary + inCapacity);
 	OSCONTAINER_ACCUMSIZE(inCapacity * sizeof(dictEntry));
 
 	count = 0;
@@ -331,10 +332,15 @@
 		return capacity;
 	}
 
-	newDict = kreallocp_type_container(dictEntry, dictionary,
-	    capacity, &finalCapacity, Z_WAITOK_ZERO);
+	newDict = kallocp_type_container(dictEntry, &finalCapacity, Z_WAITOK);
 	if (newDict) {
+		os::uninitialized_move(dictionary, dictionary + capacity, newDict);
+		os::uninitialized_value_construct(newDict + capacity, newDict + finalCapacity);
+		os::destroy(dictionary, dictionary + capacity);
+
 		OSCONTAINER_ACCUMSIZE(sizeof(dictEntry) * (finalCapacity - capacity));
+
+		kfree_type(dictEntry, capacity, dictionary);
 		dictionary = newDict;
 		capacity = finalCapacity;
 	}
@@ -348,8 +354,8 @@
 	haveUpdated();
 
 	for (unsigned int i = 0; i < count; i++) {
-		dictionary[i].key.reset();
-		dictionary[i].value.reset();
+		dictionary[i].key->taggedRelease(OSTypeID(OSCollection));
+		dictionary[i].value->taggedRelease(OSTypeID(OSCollection));
 	}
 	count = 0;
 }