X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/8f6c56a50524aa785f7e596d52dddfb331e18961..3903760236c30e3b5ace7a4eefac3a269d68957c:/libkern/c%20%20/OSString.cpp/apple/xnu.git/blobdiff_plain/8f6c56a50524aa785f7e596d52dddfb331e18961..3903760236c30e3b5ace7a4eefac3a269d68957c:/libkern/c++/OSString.cpp diff --git a/libkern/c++/OSString.cpp b/libkern/c++/OSString.cpp index fa02e32fc..835e5f25e 100644 --- a/libkern/c++/OSString.cpp +++ b/libkern/c++/OSString.cpp @@ -56,15 +56,6 @@ OSMetaClassDefineReservedUnused(OSString, 13); OSMetaClassDefineReservedUnused(OSString, 14); OSMetaClassDefineReservedUnused(OSString, 15); -#if OSALLOCDEBUG -extern "C" { - extern int debug_container_malloc_size; -}; -#define ACCUMSIZE(s) do { debug_container_malloc_size += (s); } while(0) -#else -#define ACCUMSIZE(s) -#endif - bool OSString::initWithString(const OSString *aString) { return initWithCString(aString->string); @@ -72,17 +63,59 @@ bool OSString::initWithString(const OSString *aString) bool OSString::initWithCString(const char *cString) { - if (!cString || !super::init()) - return false; + unsigned int newLength; + char * newString; - length = strlen(cString) + 1; - string = (char *) kalloc(length); - if (!string) - return false; + if (!cString || !super::init()) return false; + + newLength = strnlen(cString, kMaxStringLength); + if (newLength >= kMaxStringLength) return false; + + newLength++; + newString = (char *) kalloc_container(newLength); + if (!newString) return false; + + bcopy(cString, newString, newLength); + + if ( !(flags & kOSStringNoCopy) && string) { + kfree(string, (vm_size_t)length); + OSCONTAINER_ACCUMSIZE(-((size_t)length)); + } + string = newString; + length = newLength; + flags &= ~kOSStringNoCopy; + + OSCONTAINER_ACCUMSIZE(length); + + return true; +} + +bool OSString::initWithStringOfLength(const char *cString, size_t inlength) +{ + unsigned int newLength; + char * newString; + + if (!cString || !super::init()) return false; - bcopy(cString, string, length); + if (inlength >= kMaxStringLength) return false; - ACCUMSIZE(length); + newLength = inlength + 1; + newString = (char *) kalloc_container(newLength); + if (!newString) return false; + + bcopy(cString, newString, inlength); + newString[inlength] = 0; + + if ( !(flags & kOSStringNoCopy) && string) { + kfree(string, (vm_size_t)length); + OSCONTAINER_ACCUMSIZE(-((size_t)length)); + } + + string = newString; + length = newLength; + flags &= ~kOSStringNoCopy; + + OSCONTAINER_ACCUMSIZE(length); return true; } @@ -92,9 +125,12 @@ bool OSString::initWithCStringNoCopy(const char *cString) if (!cString || !super::init()) return false; - length = strlen(cString) + 1; + length = strnlen(cString, kMaxStringLength); + if (length >= kMaxStringLength) return false; + + length++; flags |= kOSStringNoCopy; - string = (char *) cString; + string = const_cast(cString); return true; } @@ -135,6 +171,20 @@ OSString *OSString::withCStringNoCopy(const char *cString) return me; } +OSString *OSString::withStringOfLength(const char *cString, size_t length) +{ + OSString *me = new OSString; + + if (me && !me->initWithStringOfLength(cString, length)) { + me->release(); + return 0; + } + + return me; +} + + + /* @@@ gvdl */ #if 0 OSString *OSString::stringWithFormat(const char *format, ...) @@ -164,8 +214,8 @@ OSString *OSString::stringWithFormat(const char *format, ...) void OSString::free() { if ( !(flags & kOSStringNoCopy) && string) { - kfree((vm_offset_t)string, (vm_size_t)length); - ACCUMSIZE(-length); + kfree(string, (vm_size_t)length); + OSCONTAINER_ACCUMSIZE(-((size_t)length)); } super::free(); @@ -208,7 +258,7 @@ bool OSString::isEqualTo(const OSString *aString) const bool OSString::isEqualTo(const char *aCString) const { - return strcmp(string, aCString) == 0; + return strncmp(string, aCString, length) == 0; } bool OSString::isEqualTo(const OSMetaClassBase *obj) const