Loading...
libkern/c++/OSString.cpp xnu-6153.41.3 xnu-8792.61.2
--- xnu/xnu-6153.41.3/libkern/c++/OSString.cpp
+++ xnu/xnu-8792.61.2/libkern/c++/OSString.cpp
@@ -28,17 +28,21 @@
 /* IOString.m created by rsulack on Wed 17-Sep-1997 */
 /* IOString.cpp converted to C++ on Tue 1998-9-22 */
 
+#define IOKIT_ENABLE_SHARED_PTR
+
 #include <string.h>
 
 #include <libkern/c++/OSString.h>
 #include <libkern/c++/OSSerialize.h>
+#include <libkern/c++/OSSharedPtr.h>
 #include <libkern/c++/OSLib.h>
 #include <libkern/c++/OSData.h>
 #include <string.h>
 
 #define super OSObject
 
-OSDefineMetaClassAndStructors(OSString, OSObject)
+OSDefineMetaClassAndStructorsWithZone(OSString, OSObject,
+    (zone_create_flags_t) (ZC_CACHING | ZC_ZFREE_CLEARMEM))
 OSMetaClassDefineReservedUnused(OSString, 0);
 OSMetaClassDefineReservedUnused(OSString, 1);
 OSMetaClassDefineReservedUnused(OSString, 2);
@@ -72,13 +76,14 @@
 		return false;
 	}
 
-	newLength = strnlen(cString, kMaxStringLength);
+	newLength = (unsigned int) strnlen(cString, kMaxStringLength);
 	if (newLength >= kMaxStringLength) {
 		return false;
 	}
 
 	newLength++;
-	newString = (char *) kalloc_container(newLength);
+	newString = (char *)kalloc_data(newLength,
+	    Z_VM_TAG_BT(Z_WAITOK, VM_KERN_MEMORY_LIBKERN));
 	if (!newString) {
 		return false;
 	}
@@ -86,7 +91,7 @@
 	bcopy(cString, newString, newLength);
 
 	if (!(flags & kOSStringNoCopy) && string) {
-		kfree(string, (vm_size_t)length);
+		kfree_data(string, length);
 		OSCONTAINER_ACCUMSIZE(-((size_t)length));
 	}
 	string = newString;
@@ -102,6 +107,7 @@
 OSString::initWithStringOfLength(const char *cString, size_t inlength)
 {
 	unsigned int   newLength;
+	unsigned int   cStringLength;
 	char         * newString;
 
 	if (!cString || !super::init()) {
@@ -112,12 +118,15 @@
 		return false;
 	}
 
-	if (strnlen(cString, inlength) < inlength) {
-		return false;
-	}
-
-	newLength = inlength + 1;
-	newString = (char *) kalloc_container(newLength);
+	cStringLength = (unsigned int)strnlen(cString, inlength);
+
+	if (cStringLength < inlength) {
+		inlength = cStringLength;
+	}
+
+	newLength = (unsigned int) (inlength + 1);
+	newString = (char *)kalloc_data(newLength,
+	    Z_VM_TAG_BT(Z_WAITOK, VM_KERN_MEMORY_LIBKERN));
 	if (!newString) {
 		return false;
 	}
@@ -126,7 +135,7 @@
 	newString[inlength] = 0;
 
 	if (!(flags & kOSStringNoCopy) && string) {
-		kfree(string, (vm_size_t)length);
+		kfree_data(string, length);
 		OSCONTAINER_ACCUMSIZE(-((size_t)length));
 	}
 
@@ -146,7 +155,7 @@
 		return false;
 	}
 
-	length = strnlen(cString, kMaxStringLength);
+	length = (unsigned int) strnlen(cString, kMaxStringLength);
 	if (length >= kMaxStringLength) {
 		return false;
 	}
@@ -158,53 +167,49 @@
 	return true;
 }
 
-OSString *
+OSSharedPtr<OSString>
 OSString::withString(const OSString *aString)
 {
-	OSString *me = new OSString;
+	OSSharedPtr<OSString> me = OSMakeShared<OSString>();
 
 	if (me && !me->initWithString(aString)) {
-		me->release();
-		return NULL;
-	}
-
-	return me;
-}
-
-OSString *
+		return nullptr;
+	}
+
+	return me;
+}
+
+OSSharedPtr<OSString>
 OSString::withCString(const char *cString)
 {
-	OSString *me = new OSString;
+	OSSharedPtr<OSString> me = OSMakeShared<OSString>();
 
 	if (me && !me->initWithCString(cString)) {
-		me->release();
-		return NULL;
-	}
-
-	return me;
-}
-
-OSString *
+		return nullptr;
+	}
+
+	return me;
+}
+
+OSSharedPtr<OSString>
 OSString::withCStringNoCopy(const char *cString)
 {
-	OSString *me = new OSString;
+	OSSharedPtr<OSString> me = OSMakeShared<OSString>();
 
 	if (me && !me->initWithCStringNoCopy(cString)) {
-		me->release();
-		return NULL;
-	}
-
-	return me;
-}
-
-OSString *
-OSString::withStringOfLength(const char *cString, size_t length)
-{
-	OSString *me = new OSString;
+		return nullptr;
+	}
+
+	return me;
+}
+
+OSSharedPtr<OSString>
+OSString::withCString(const char *cString, size_t length)
+{
+	OSSharedPtr<OSString> me = OSMakeShared<OSString>();
 
 	if (me && !me->initWithStringOfLength(cString, length)) {
-		me->release();
-		return NULL;
+		return nullptr;
 	}
 
 	return me;
@@ -245,7 +250,7 @@
 OSString::free()
 {
 	if (!(flags & kOSStringNoCopy) && string) {
-		kfree(string, (vm_size_t)length);
+		kfree_data(string, length);
 		OSCONTAINER_ACCUMSIZE(-((size_t)length));
 	}
 
@@ -325,7 +330,7 @@
 		return false;
 	}
 
-	unsigned int dataLen = obj->getLength();;
+	unsigned int dataLen = obj->getLength();
 	const char * dataPtr = (const char *) obj->getBytesNoCopy();
 
 	if (dataLen != length) {