Alexandre Julliard : winealsa: Avoid memory leak with snd_card_get_name.

Alexandre Julliard julliard at winehq.org
Wed Feb 1 11:23:26 CST 2012


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Feb  1 16:55:53 2012 +0100

winealsa: Avoid memory leak with snd_card_get_name.

---

 dlls/winealsa.drv/mmdevdrv.c |   34 +++++++++++++++++++---------------
 1 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
index 0bedcc5..7621423 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -363,7 +363,7 @@ static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR **ids, char **keys,
     for(err = snd_card_next(&card); card != -1 && err >= 0;
             err = snd_card_next(&card)){
         char cardpath[64];
-        const char *cardname;
+        char *cardname;
         WCHAR *cardnameW;
         snd_ctl_t *ctl;
         DWORD len;
@@ -376,24 +376,28 @@ static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR **ids, char **keys,
             continue;
         }
 
-        if((err = snd_card_get_name(card, (char **)&cardname)) < 0){
+        if(snd_card_get_name(card, &cardname) < 0) {
+            /* FIXME: Should be localized */
+            static const WCHAR nameW[] = {'U','n','k','n','o','w','n',' ','s','o','u','n','d','c','a','r','d',0};
             WARN("Unable to get card name for ALSA device %s: %d (%s)\n",
                     cardpath, err, snd_strerror(err));
-            /* FIXME: Should be localized */
-            cardname = "Unknown soundcard";
-        }
+            alsa_get_card_devices(stream, ids, keys, num, ctl, card, nameW);
+        }else{
+            len = MultiByteToWideChar(CP_UNIXCP, 0, cardname, -1, NULL, 0);
+            cardnameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
 
-        len = MultiByteToWideChar(CP_UNIXCP, 0, cardname, -1, NULL, 0);
-        cardnameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
-        if(!cardnameW){
-            snd_ctl_close(ctl);
-            return E_OUTOFMEMORY;
-        }
-        MultiByteToWideChar(CP_UNIXCP, 0, cardname, -1, cardnameW, len);
+            if(!cardnameW){
+                free(cardname);
+                snd_ctl_close(ctl);
+                return E_OUTOFMEMORY;
+            }
+            MultiByteToWideChar(CP_UNIXCP, 0, cardname, -1, cardnameW, len);
 
-        alsa_get_card_devices(stream, ids, keys, num, ctl, card, cardnameW);
+            alsa_get_card_devices(stream, ids, keys, num, ctl, card, cardnameW);
 
-        HeapFree(GetProcessHeap(), 0, cardnameW);
+            HeapFree(GetProcessHeap(), 0, cardnameW);
+            free(cardname);
+        }
 
         snd_ctl_close(ctl);
     }




More information about the wine-cvs mailing list