X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/e3d460c9de4426da6c630c3ae3f46173a99f82d8..dd5fb164cf5b32c462296bc65e289e100f74b59a:/OSX/libsecurity_utilities/lib/cfmunge.cpp diff --git a/OSX/libsecurity_utilities/lib/cfmunge.cpp b/OSX/libsecurity_utilities/lib/cfmunge.cpp index b3776ed5..7c7bbf96 100644 --- a/OSX/libsecurity_utilities/lib/cfmunge.cpp +++ b/OSX/libsecurity_utilities/lib/cfmunge.cpp @@ -29,6 +29,7 @@ #include "cfmunge.h" #include #include +#include namespace Security { @@ -45,22 +46,6 @@ namespace Security { #define F_NUMBER 'N' -// -// Initialize a CFMunge. We start out with the default CFAllocator, and -// we do not throw errors. -// -CFMunge::CFMunge(const char *fmt, va_list arg) - : format(fmt), allocator(NULL), error(errSecSuccess) -{ - va_copy(args, arg); -} - -CFMunge::~CFMunge() -{ - va_end(args); -} - - // // Skip whitespace and other fluff and deliver the next significant character. // @@ -93,11 +78,11 @@ bool CFMunge::parameter() switch (*++format) { case 'A': ++format; - allocator = va_arg(args, CFAllocatorRef); + allocator = va_arg(*args, CFAllocatorRef); return true; case 'E': ++format; - error = va_arg(args, OSStatus); + error = va_arg(*args, OSStatus); return true; default: return false; @@ -147,21 +132,21 @@ CFTypeRef CFMake::makeformat() switch (*format++) { case 'b': // blob (pointer, length) { - const void *data = va_arg(args, const void *); - size_t length = va_arg(args, size_t); + const void *data = va_arg(*args, const void *); + size_t length = va_arg(*args, size_t); return CFDataCreate(allocator, (const UInt8 *)data, length); } case F_BOOLEAN: // boolean (with int promotion) - return va_arg(args, int) ? kCFBooleanTrue : kCFBooleanFalse; + return va_arg(*args, int) ? kCFBooleanTrue : kCFBooleanFalse; case 'd': - return makeCFNumber(va_arg(args, int)); + return makeCFNumber(va_arg(*args, int)); case 's': - return CFStringCreateWithCString(allocator, va_arg(args, const char *), + return CFStringCreateWithCString(allocator, va_arg(*args, const char *), kCFStringEncodingUTF8); case F_OBJECT: - return CFRetain(va_arg(args, CFTypeRef)); + return CFRetain(va_arg(*args, CFTypeRef)); case 'u': - return makeCFNumber(va_arg(args, unsigned int)); + return makeCFNumber(va_arg(*args, unsigned int)); default: assert(false); return NULL; @@ -230,7 +215,7 @@ CFTypeRef CFMake::makedictionary() CFMutableDictionaryRef dict; if (next('+')) { // {+%O, => copy dictionary argument, then proceed if (next('%') && next('O')) { - CFDictionaryRef source = va_arg(args, CFDictionaryRef); + CFDictionaryRef source = va_arg(*args, CFDictionaryRef); dict = CFDictionaryCreateMutableCopy(allocator, NULL, source); if (next('}')) return dict; @@ -239,10 +224,12 @@ CFTypeRef CFMake::makedictionary() } else dict = CFDictionaryCreateMutable(allocator, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + if (dict == NULL) + return dict; if (add(dict)) return dict; else { - CFRelease(dict); + CFReleaseSafe(dict); return NULL; } } @@ -292,7 +279,7 @@ CFTypeRef CFMake::makearray() CFMutableArrayRef array = NULL; if (next('+')) { // {+%O, => copy array argument, then proceed if (next('%') && next('O')) { - CFArrayRef source = va_arg(args, CFArrayRef); + CFArrayRef source = va_arg(*args, CFArrayRef); array = CFArrayCreateMutableCopy(allocator, 0, source); if (next('}')) return array; @@ -323,7 +310,7 @@ CFTypeRef CFMake::makearray() // class CFScan : public CFMake { public: - CFScan(const char *format, va_list args) + CFScan(const char *format, va_list *args) : CFMake(format, args), suppress(false) { } bool scan(CFTypeRef obj); @@ -416,7 +403,7 @@ template void CFScan::store(Type value) { if (!suppress) - *va_arg(args, Type *) = value; + *va_arg(*args, Type *) = value; } @@ -454,8 +441,8 @@ bool CFScan::scanformat(CFTypeRef obj) switch (*format) { case 'f': // %Bf - two arguments (value, &variable) { - unsigned flag = va_arg(args, unsigned); - unsigned *value = va_arg(args, unsigned *); + unsigned flag = va_arg(*args, unsigned); + unsigned *value = va_arg(*args, unsigned *); if (obj == kCFBooleanTrue && !suppress) *value |= flag; return true; @@ -555,12 +542,12 @@ CFTypeRef cfmake(const char *format, ...) { va_list args; va_start(args, format); - CFTypeRef result = CFMake(format, args).make(); + CFTypeRef result = CFMake(format, &args).make(); va_end(args); return result; } -CFTypeRef vcfmake(const char *format, va_list args) +CFTypeRef vcfmake(const char *format, va_list *args) { return CFMake(format, args).make(); } @@ -569,7 +556,7 @@ CFDictionaryRef cfadd(CFMutableDictionaryRef dict, const char *format, ...) { va_list args; va_start(args, format); - CFDictionaryRef result = CFMake(format, args).addto(dict); + CFDictionaryRef result = CFMake(format, &args).addto(dict); va_end(args); return result; } @@ -579,12 +566,12 @@ bool cfscan(CFTypeRef obj, const char *format, ...) { va_list args; va_start(args, format); - bool result = vcfscan(obj, format, args); + bool result = vcfscan(obj, format, &args); va_end(args); return result; } -bool vcfscan(CFTypeRef obj, const char *format, va_list args) +bool vcfscan(CFTypeRef obj, const char *format, va_list *args) { return CFScan(format, args).scan(obj); } @@ -594,12 +581,12 @@ CFTypeRef cfget(CFTypeRef obj, const char *format, ...) { va_list args; va_start(args, format); - CFTypeRef result = vcfget(obj, format, args); + CFTypeRef result = vcfget(obj, format, &args); va_end(args); return result; } -CFTypeRef vcfget(CFTypeRef obj, const char *format, va_list args) +CFTypeRef vcfget(CFTypeRef obj, const char *format, va_list *args) { return CFScan(format, args).dictpath(obj); }