X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/5d5c5d0d5b79ade9a973d55186ffda2638ba2b6e..3903760236c30e3b5ace7a4eefac3a269d68957c:/libkern/c%20%20/OSString.cpp/apple/xnu.git/blobdiff_plain/5d5c5d0d5b79ade9a973d55186ffda2638ba2b6e..3903760236c30e3b5ace7a4eefac3a269d68957c:/libkern/c++/OSString.cpp diff --git a/libkern/c++/OSString.cpp b/libkern/c++/OSString.cpp index 0f9f9635f..835e5f25e 100644 --- a/libkern/c++/OSString.cpp +++ b/libkern/c++/OSString.cpp @@ -1,31 +1,29 @@ /* * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_OSREFERENCE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the - * License may not be used to create, or enable the creation or - * redistribution of, unlawful or unlicensed copies of an Apple operating - * system, or to circumvent, violate, or enable the circumvention or - * violation of, any terms of an Apple operating system software license - * agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and * limitations under the License. - * - * @APPLE_LICENSE_OSREFERENCE_HEADER_END@ + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* IOString.m created by rsulack on Wed 17-Sep-1997 */ /* IOString.cpp converted to C++ on Tue 1998-9-22 */ @@ -58,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); @@ -74,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; +} - bcopy(cString, string, length); +bool OSString::initWithStringOfLength(const char *cString, size_t inlength) +{ + unsigned int newLength; + char * newString; + + if (!cString || !super::init()) return false; + + if (inlength >= kMaxStringLength) return false; + + 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)); + } - ACCUMSIZE(length); + string = newString; + length = newLength; + flags &= ~kOSStringNoCopy; + + OSCONTAINER_ACCUMSIZE(length); return true; } @@ -94,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; } @@ -137,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, ...) @@ -167,7 +215,7 @@ void OSString::free() { if ( !(flags & kOSStringNoCopy) && string) { kfree(string, (vm_size_t)length); - ACCUMSIZE(-length); + OSCONTAINER_ACCUMSIZE(-((size_t)length)); } super::free(); @@ -210,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