Fix a bunch of small memory leaks in the mac device handling code.

This commit is contained in:
John Maguire 2012-01-20 16:25:05 -08:00
parent 028ac3126c
commit ab33d9aa8c

View File

@ -177,6 +177,7 @@ void MacDeviceLister::ShutDown() {
// IOKit helpers. // IOKit helpers.
namespace { namespace {
// Caller is responsible for calling CFRelease().
CFTypeRef GetUSBRegistryEntry(io_object_t device, CFStringRef key) { CFTypeRef GetUSBRegistryEntry(io_object_t device, CFStringRef key) {
io_iterator_t it; io_iterator_t it;
if (IORegistryEntryGetParentIterator(device, kIOServicePlane, &it) == KERN_SUCCESS) { if (IORegistryEntryGetParentIterator(device, kIOServicePlane, &it) == KERN_SUCCESS) {
@ -239,9 +240,11 @@ NSObject* GetPropertyForDevice(io_object_t device, CFStringRef key) {
return nil; return nil;
} }
NSDictionary* dict = (NSDictionary*)properties; scoped_nsobject<NSDictionary> dict((NSDictionary*)properties); // Takes ownership.
NSObject* prop = [dict objectForKey:(NSString*)key]; NSObject* prop = [dict objectForKey:(NSString*)key];
if (prop) { if (prop) {
// The dictionary goes out of scope so we should retain this object.
[prop retain];
return prop; return prop;
} }
@ -270,13 +273,13 @@ int GetUSBDeviceClass(io_object_t device) {
} }
QString GetIconForDevice(io_object_t device) { QString GetIconForDevice(io_object_t device) {
NSDictionary* media_icon = (NSDictionary*)GetPropertyForDevice(device, CFSTR("IOMediaIcon")); scoped_nsobject<NSDictionary> media_icon((NSDictionary*)GetPropertyForDevice(device, CFSTR("IOMediaIcon")));
if (media_icon) { if (media_icon) {
NSString* bundle = (NSString*)[media_icon objectForKey:@"CFBundleIdentifier"]; NSString* bundle = (NSString*)[media_icon objectForKey:@"CFBundleIdentifier"];
NSString* file = (NSString*)[media_icon objectForKey:@"IOBundleResourceFile"]; NSString* file = (NSString*)[media_icon objectForKey:@"IOBundleResourceFile"];
NSURL* bundle_url = (NSURL*)KextManagerCreateURLForBundleIdentifier( scoped_nsobject<NSURL> bundle_url((NSURL*)KextManagerCreateURLForBundleIdentifier(
kCFAllocatorDefault, (CFStringRef)bundle); kCFAllocatorDefault, (CFStringRef)bundle));
QString path = QString::fromUtf8([[bundle_url path] UTF8String]); QString path = QString::fromUtf8([[bundle_url path] UTF8String]);
path += "/Contents/Resources/"; path += "/Contents/Resources/";
@ -296,8 +299,9 @@ QString GetSerialForDevice(io_object_t device) {
} }
QString GetSerialForMTPDevice(io_object_t device) { QString GetSerialForMTPDevice(io_object_t device) {
return QString( scoped_nsobject<NSString> serial((NSString*)
QString("MTP/") + [(NSString*)GetPropertyForDevice(device, CFSTR(kUSBSerialNumberString)) UTF8String]); GetPropertyForDevice(device, CFSTR(kUSBSerialNumberString)));
return QString(QString("MTP/") + [serial UTF8String]);
} }
QString FindDeviceProperty(const QString& bsd_name, CFStringRef property) { QString FindDeviceProperty(const QString& bsd_name, CFStringRef property) {
@ -348,7 +352,7 @@ quint64 MacDeviceLister::GetCapacity(const QUrl& url) {
void MacDeviceLister::DiskAddedCallback(DADiskRef disk, void* context) { void MacDeviceLister::DiskAddedCallback(DADiskRef disk, void* context) {
MacDeviceLister* me = reinterpret_cast<MacDeviceLister*>(context); MacDeviceLister* me = reinterpret_cast<MacDeviceLister*>(context);
NSDictionary* properties = (NSDictionary*)DADiskCopyDescription(disk); scoped_nsobject<NSDictionary> properties((NSDictionary*)DADiskCopyDescription(disk));
NSString* kind = [properties objectForKey:(NSString*)kDADiskDescriptionMediaKindKey]; NSString* kind = [properties objectForKey:(NSString*)kDADiskDescriptionMediaKindKey];
#ifdef HAVE_AUDIOCD #ifdef HAVE_AUDIOCD
@ -371,12 +375,12 @@ void MacDeviceLister::DiskAddedCallback(DADiskRef disk, void* context) {
QString vendor = GetUSBRegistryEntryString(device, CFSTR(kUSBVendorString)); QString vendor = GetUSBRegistryEntryString(device, CFSTR(kUSBVendorString));
QString product = GetUSBRegistryEntryString(device, CFSTR(kUSBProductString)); QString product = GetUSBRegistryEntryString(device, CFSTR(kUSBProductString));
CFMutableDictionaryRef properties; CFMutableDictionaryRef cf_properties;
kern_return_t ret = IORegistryEntryCreateCFProperties( kern_return_t ret = IORegistryEntryCreateCFProperties(
device, &properties, kCFAllocatorDefault, 0); device, &cf_properties, kCFAllocatorDefault, 0);
if (ret == KERN_SUCCESS) { if (ret == KERN_SUCCESS) {
NSDictionary* dict = (NSDictionary*)properties; scoped_nsobject<NSDictionary> dict((NSDictionary*)cf_properties); // Takes ownership.
if ([[dict objectForKey:@"Removable"] intValue] == 1) { if ([[dict objectForKey:@"Removable"] intValue] == 1) {
QString serial = GetSerialForDevice(device); QString serial = GetSerialForDevice(device);
if (!serial.isEmpty()) { if (!serial.isEmpty()) {