From ae94091202e41e5a219b1dee5916c485f243b39d Mon Sep 17 00:00:00 2001 From: das Date: Sun, 7 Dec 2008 16:39:32 +0000 Subject: Tcl_MacOSXOpenVersionedBundleResources: Fix leak, simplify logic --- macosx/tclMacOSXBundle.c | 64 +++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/macosx/tclMacOSXBundle.c b/macosx/tclMacOSXBundle.c index 469d2f1..f9af0b9 100644 --- a/macosx/tclMacOSXBundle.c +++ b/macosx/tclMacOSXBundle.c @@ -48,7 +48,7 @@ * permission to use and distribute the software in accordance with the * terms specified in this license. * - * RCS: @(#) $Id: tclMacOSXBundle.c,v 1.11 2007/04/23 20:46:13 das Exp $ + * RCS: @(#) $Id: tclMacOSXBundle.c,v 1.11.4.1 2008/12/07 16:39:32 das Exp $ */ #include "tclPort.h" @@ -121,7 +121,7 @@ Tcl_MacOSXOpenVersionedBundleResources( char *libraryPath) { #ifdef HAVE_COREFOUNDATION - CFBundleRef bundleRef; + CFBundleRef bundleRef, versionedBundleRef = NULL; CFStringRef bundleNameRef; CFURLRef libURL; @@ -138,41 +138,46 @@ Tcl_MacOSXOpenVersionedBundleResources( * Create bundle from bundleVersion subdirectory of 'Versions'. */ - CFBundleRef versionedBundleRef = NULL; - CFURLRef versionedBundleURL = NULL; - CFStringRef bundleVersionRef = CFStringCreateWithCString(NULL, - bundleVersion, kCFStringEncodingUTF8); CFURLRef bundleURL = CFBundleCopyBundleURL(bundleRef); if (bundleURL) { - CFStringRef bundleTailRef = CFURLCopyLastPathComponent(bundleURL); + CFStringRef bundleVersionRef = CFStringCreateWithCString(NULL, + bundleVersion, kCFStringEncodingUTF8); - if (bundleTailRef) { - if (CFStringCompare(bundleTailRef, bundleVersionRef, 0) == - kCFCompareEqualTo) { - versionedBundleRef = bundleRef; - } - CFRelease(bundleTailRef); - } - } + if (bundleVersionRef) { + CFStringRef bundleTailRef = CFURLCopyLastPathComponent( + bundleURL); - if (bundleURL && !versionedBundleRef) { - CFURLRef versURL = CFURLCreateCopyAppendingPathComponent(NULL, - bundleURL, CFSTR("Versions"), TRUE); - - if (versURL) { - versionedBundleURL = CFURLCreateCopyAppendingPathComponent( - NULL, versURL, bundleVersionRef, TRUE); - CFRelease(versURL); + if (bundleTailRef) { + if (CFStringCompare(bundleTailRef, bundleVersionRef, 0) == + kCFCompareEqualTo) { + versionedBundleRef = (CFBundleRef) CFRetain(bundleRef); + } + CFRelease(bundleTailRef); + } + if (!versionedBundleRef) { + CFURLRef versURL = CFURLCreateCopyAppendingPathComponent( + NULL, bundleURL, CFSTR("Versions"), TRUE); + + if (versURL) { + CFURLRef versionedBundleURL = + CFURLCreateCopyAppendingPathComponent( + NULL, versURL, bundleVersionRef, TRUE); + if (versionedBundleURL) { + versionedBundleRef = CFBundleCreate(NULL, + versionedBundleURL); + CFRelease(versionedBundleURL); + } + CFRelease(versURL); + } + } + CFRelease(bundleVersionRef); } CFRelease(bundleURL); } - CFRelease(bundleVersionRef); - if (versionedBundleURL) { - versionedBundleRef = CFBundleCreate(NULL, versionedBundleURL); - CFRelease(versionedBundleURL); + if (versionedBundleRef) { + bundleRef = versionedBundleRef; } - bundleRef = versionedBundleRef; } if (bundleRef) { @@ -219,6 +224,9 @@ Tcl_MacOSXOpenVersionedBundleResources( (unsigned char*) libraryPath, maxPathLen); CFRelease(libURL); } + if (versionedBundleRef) { + CFRelease(versionedBundleRef); + } } if (libraryPath[0]) { -- cgit v0.12