X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/fe8ab488e9161c46dd9885d58fc52996dc0249ff..ea3f04195ba4a5034c9c8e9b726d4f7ce96f1832:/libsyscall/mach/string.c diff --git a/libsyscall/mach/string.c b/libsyscall/mach/string.c index e1555b49d..fcb9e6fd2 100644 --- a/libsyscall/mach/string.c +++ b/libsyscall/mach/string.c @@ -2,7 +2,7 @@ * Copyright (c) 2010 Apple Inc. All rights reserved. * * @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 @@ -11,10 +11,10 @@ * 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, @@ -22,7 +22,7 @@ * 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_OSREFERENCE_LICENSE_HEADER_END@ */ @@ -48,14 +48,14 @@ _mach_hex(char **buffer, int *length, unsigned long long n) { char buf[32]; char *cp = buf + sizeof(buf); - + if (n) { *--cp = '\0'; while (n) { *--cp = hex[n & 0xf]; n >>= 4; } - + int width = _mach_strlen(cp); while (width > 0 && length > 0) { *(*buffer)++ = *cp++; @@ -70,7 +70,7 @@ _mach_vsnprintf(char *buffer, int length, const char *fmt, va_list ap) { int width, max = length; char *out_ptr = buffer; - + // we only ever write n-1 bytes so we can put a \0 at the end length--; while (length > 0 && *fmt) { @@ -86,26 +86,28 @@ _mach_vsnprintf(char *buffer, int length, const char *fmt, va_list ap) // only going to support a specific subset of sprintf flags // namely %s, %x, with no padding modifiers switch (*fmt++) { - case 's': - { - char *cp = va_arg(ap, char*); - width = _mach_strlen(cp); - while (width > 0 && length > 0) { - *(out_ptr++) = *(cp++); - width--; - length--; - } - break; - } - case 'x': - { - _mach_hex(&out_ptr, &length, va_arg(ap, unsigned int)); - break; + case 's': + { + char *cp = va_arg(ap, char*); + width = _mach_strlen(cp); + while (width > 0 && length > 0) { + *(out_ptr++) = *(cp++); + width--; + length--; } + break; + } + case 'x': + { + _mach_hex(&out_ptr, &length, va_arg(ap, unsigned int)); + break; + } } } - *out_ptr = '\0'; - return max - length; + if (max > 0) { + *out_ptr = '\0'; + } + return max - (length + 1); /* don't include the final NULL in the return value */ } int