Fix memory leaks in Mac OS X CoreWLAN code. b=548796 r=smichaud

This commit is contained in:
Josh Aas 2010-02-26 14:18:12 -06:00
Родитель 812f008676
Коммит 69c778877c
1 изменённых файлов: 24 добавлений и 10 удалений

Просмотреть файл

@ -43,6 +43,7 @@
#include <objc/objc.h>
#include <objc/objc-runtime.h>
#include "nsObjCExceptions.h"
#include "nsAutoPtr.h"
#include "nsCOMArray.h"
#include "nsWifiMonitor.h"
@ -59,36 +60,43 @@ BOOL UsingSnowLeopard() {
nsresult
GetAccessPointsFromWLAN(nsCOMArray<nsWifiAccessPoint> &accessPoints)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_RETURN;
if (!UsingSnowLeopard())
return NS_ERROR_NOT_AVAILABLE;
accessPoints.Clear();
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
@try {
NSBundle * bundle = [[NSBundle alloc] initWithPath:@"/System/Library/Frameworks/CoreWLAN.framework"];
if (!bundle)
@try {
NSBundle * bundle = [[[NSBundle alloc] initWithPath:@"/System/Library/Frameworks/CoreWLAN.framework"] autorelease];
if (!bundle) {
[pool release];
return NS_ERROR_NOT_AVAILABLE;
}
Class CWI_class = [bundle classNamed:@"CWInterface"];
if (!CWI_class)
if (!CWI_class) {
[pool release];
return NS_ERROR_NOT_AVAILABLE;
}
NSDictionary *params = nil;
NSError *err = nil;
id scanResult = [[CWI_class interface] scanForNetworksWithParameters: params error: err];
if (!scanResult)
id scanResult = [[CWI_class interface] scanForNetworksWithParameters:nil error:nil];
if (!scanResult) {
[pool release];
return NS_ERROR_NOT_AVAILABLE;
}
NSArray* scan = [NSMutableArray arrayWithArray:scanResult];
NSEnumerator *enumerator = [scan objectEnumerator];
while (id anObject = [enumerator nextObject]) {
nsWifiAccessPoint* ap = new nsWifiAccessPoint();
if (!ap)
if (!ap) {
[pool release];
return NS_ERROR_OUT_OF_MEMORY;
}
NSData* data = [anObject bssidData];
ap->setMac((unsigned char*)[data bytes]);
ap->setSignal([[anObject rssi] intValue]);
@ -98,7 +106,13 @@ GetAccessPointsFromWLAN(nsCOMArray<nsWifiAccessPoint> &accessPoints)
}
}
@catch(NSException *_exn) {
[pool release];
return NS_ERROR_NOT_AVAILABLE;
}
[pool release];
return NS_OK;
NS_OBJC_END_TRY_ABORT_BLOCK_RETURN(NS_ERROR_NOT_AVAILABLE);
}