diff options
author | das <das> | 2008-12-07 16:39:56 (GMT) |
---|---|---|
committer | das <das> | 2008-12-07 16:39:56 (GMT) |
commit | 21007eb5fa1a81fd34515e6412b38e7531dcf45c (patch) | |
tree | 1706cfa3a9ed4d38431bb744a73e4fea31ad718e /macosx | |
parent | a7c51a9e790452db4a5d6bb8f38111f2f8e401bd (diff) | |
download | tcl-21007eb5fa1a81fd34515e6412b38e7531dcf45c.zip tcl-21007eb5fa1a81fd34515e6412b38e7531dcf45c.tar.gz tcl-21007eb5fa1a81fd34515e6412b38e7531dcf45c.tar.bz2 |
Tcl_MacOSXOpenVersionedBundleResources: Fix leak, simplify logic
Diffstat (limited to 'macosx')
-rw-r--r-- | macosx/tclMacOSXBundle.c | 64 |
1 files changed, 36 insertions, 28 deletions
diff --git a/macosx/tclMacOSXBundle.c b/macosx/tclMacOSXBundle.c index 3355e5f..af047d2 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.3.2.6 2007/04/29 02:21:33 das Exp $ + * RCS: @(#) $Id: tclMacOSXBundle.c,v 1.3.2.7 2008/12/07 16:39:56 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]) { |