Ken Thomases : dinput: Fix numerous leaks.

Alexandre Julliard julliard at winehq.org
Mon Apr 14 14:18:55 CDT 2014


Module: wine
Branch: master
Commit: 180b9e63d92ed26adacb878eec33bbac194054d0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=180b9e63d92ed26adacb878eec33bbac194054d0

Author: Ken Thomases <ken at codeweavers.com>
Date:   Sun Apr 13 18:34:23 2014 -0500

dinput: Fix numerous leaks.

---

 dlls/dinput/joystick_osx.c |   34 +++++++++++++++++++++++++++-------
 1 file changed, 27 insertions(+), 7 deletions(-)

diff --git a/dlls/dinput/joystick_osx.c b/dlls/dinput/joystick_osx.c
index 69d8bd6..24fd29f 100644
--- a/dlls/dinput/joystick_osx.c
+++ b/dlls/dinput/joystick_osx.c
@@ -95,7 +95,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(dinput);
 
-static IOHIDManagerRef hid_manager = NULL;
 static CFMutableArrayRef device_main_elements = NULL;
 
 typedef struct JoystickImpl JoystickImpl;
@@ -211,6 +210,7 @@ static HRESULT get_ff(IOHIDDeviceRef device, FFDeviceObjectReference *ret)
     io_service_t service;
     CFMutableDictionaryRef matching;
     CFTypeRef location_id;
+    HRESULT hr;
 
     matching = IOServiceMatching(kIOHIDDeviceKey);
     if(!matching){
@@ -229,10 +229,13 @@ static HRESULT get_ff(IOHIDDeviceRef device, FFDeviceObjectReference *ret)
 
     service = IOServiceGetMatchingService(kIOMasterPortDefault, matching);
 
-    if(!ret)
-        return FFIsForceFeedback(service) == FF_OK ? S_OK : S_FALSE;
+    if (ret)
+        hr = osx_to_win32_hresult(FFCreateDevice(service, ret));
+    else
+        hr = FFIsForceFeedback(service) == FF_OK ? S_OK : S_FALSE;
 
-    return osx_to_win32_hresult(FFCreateDevice(service, ret));
+    IOObjectRelease(service);
+    return hr;
 }
 
 static CFMutableDictionaryRef create_osx_device_match(int usage)
@@ -265,12 +268,14 @@ static CFMutableDictionaryRef create_osx_device_match(int usage)
             else
             {
                 ERR("CFNumberCreate() failed.\n");
+                CFRelease(result);
                 return NULL;
             }
         }
         else
         {
             ERR("CFNumberCreate failed.\n");
+            CFRelease(result);
             return NULL;
         }
     }
@@ -315,6 +320,7 @@ static CFIndex find_top_level(IOHIDDeviceRef hid_device, CFMutableArrayRef main_
                 }
             }
         }
+        CFRelease(elements);
     }
     return total;
 }
@@ -341,6 +347,7 @@ static void get_element_children(IOHIDElementRef element, CFMutableArrayRef all_
 
 static int find_osx_devices(void)
 {
+    IOHIDManagerRef hid_manager;
     CFMutableDictionaryRef result;
     CFSetRef devset;
     CFMutableArrayRef matching;
@@ -349,6 +356,7 @@ static int find_osx_devices(void)
     if (IOHIDManagerOpen( hid_manager, 0 ) != kIOReturnSuccess)
     {
         ERR("Couldn't open IOHIDManager.\n");
+        CFRelease( hid_manager );
         return 0;
     }
 
@@ -360,18 +368,21 @@ static int find_osx_devices(void)
     if (!result)
     {
         CFRelease(matching);
-        return 0;
+        goto fail;
     }
     CFArrayAppendValue( matching, result );
+    CFRelease( result );
     result = create_osx_device_match(kHIDUsage_GD_GamePad);
     if (!result)
     {
         CFRelease(matching);
-        return 0;
+        goto fail;
     }
     CFArrayAppendValue( matching, result );
+    CFRelease( result );
 
     IOHIDManagerSetDeviceMatchingMultiple( hid_manager, matching);
+    CFRelease( matching );
     devset = IOHIDManagerCopyDevices( hid_manager );
     if (devset)
     {
@@ -383,7 +394,10 @@ static int find_osx_devices(void)
 
         device_main_elements = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
         if (!device_main_elements)
-            return 0;
+        {
+            CFRelease( devices );
+            goto fail;
+        }
 
         num_main_elements = 0;
         for (idx = 0; idx < num_devices; idx++)
@@ -401,6 +415,10 @@ static int find_osx_devices(void)
         TRACE("found %i device(s), %i collection(s)\n",(int)num_devices,(int)num_main_elements);
         return (int)num_main_elements;
     }
+
+fail:
+    IOHIDManagerClose( hid_manager, 0 );
+    CFRelease( hid_manager );
     return 0;
 }
 
@@ -1018,6 +1036,8 @@ static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput,
 
 FAILED:
     hr = DIERR_OUTOFMEMORY;
+    if (newDevice->ff) FFReleaseDevice(newDevice->ff);
+    if (newDevice->elements) CFRelease(newDevice->elements);
     if (df) HeapFree(GetProcessHeap(), 0, df->rgodf);
     HeapFree(GetProcessHeap(), 0, df);
     release_DataFormat(&newDevice->generic.base.data_format);




More information about the wine-cvs mailing list