dsound: Fix a memory leak.

Andrew Eikum aeikum at codeweavers.com
Thu Jun 22 08:14:21 CDT 2017


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Wed, Jun 21, 2017 at 04:23:52PM +0800, Dmitry Timoshkov wrote:
> Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
> ---
>  dlls/dsound/dsound_main.c    |  2 +-
>  dlls/dsound/dsound_private.h | 15 ++++++++++++++-
>  dlls/dsound/propset.c        | 12 +++++-------
>  3 files changed, 20 insertions(+), 9 deletions(-)
> 
> diff --git a/dlls/dsound/dsound_main.c b/dlls/dsound/dsound_main.c
> index 796fe1e526..8dd86e40ed 100644
> --- a/dlls/dsound/dsound_main.c
> +++ b/dlls/dsound/dsound_main.c
> @@ -89,7 +89,7 @@ CRITICAL_SECTION DSOUND_capturers_lock = { &DSOUND_capturers_lock_debug, -1, 0,
>  GUID                    DSOUND_renderer_guids[MAXWAVEDRIVERS];
>  GUID                    DSOUND_capture_guids[MAXWAVEDRIVERS];
>  
> -WCHAR wine_vxd_drv[] = { 'w','i','n','e','m','m','.','v','x','d', 0 };
> +const WCHAR wine_vxd_drv[] = { 'w','i','n','e','m','m','.','v','x','d', 0 };
>  
>  /* All default settings, you most likely don't want to touch these, see wiki on UsefulRegistryKeys */
>  int ds_hel_buflen = 32768 * 2;
> diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h
> index b15189ed2d..c045b38f4a 100644
> --- a/dlls/dsound/dsound_private.h
> +++ b/dlls/dsound/dsound_private.h
> @@ -31,6 +31,7 @@
>  #include "uuids.h"
>  
>  #include "wine/list.h"
> +#include "wine/unicode.h"
>  
>  #define DS_MAX_CHANNELS 6
>  
> @@ -254,7 +255,7 @@ extern struct list DSOUND_renderers DECLSPEC_HIDDEN;
>  extern GUID DSOUND_renderer_guids[MAXWAVEDRIVERS] DECLSPEC_HIDDEN;
>  extern GUID DSOUND_capture_guids[MAXWAVEDRIVERS] DECLSPEC_HIDDEN;
>  
> -extern WCHAR wine_vxd_drv[] DECLSPEC_HIDDEN;
> +extern const WCHAR wine_vxd_drv[] DECLSPEC_HIDDEN;
>  
>  void setup_dsound_options(void) DECLSPEC_HIDDEN;
>  
> @@ -264,3 +265,15 @@ BOOL DSOUND_check_supported(IAudioClient *client, DWORD rate,
>          DWORD depth, WORD channels) DECLSPEC_HIDDEN;
>  HRESULT enumerate_mmdevices(EDataFlow flow, GUID *guids,
>          LPDSENUMCALLBACKW cb, void *user) DECLSPEC_HIDDEN;
> +
> +static inline WCHAR *strdupW( const WCHAR *str )
> +{
> +    size_t size;
> +    WCHAR *ret;
> +
> +    if (!str) return NULL;
> +    size = (strlenW( str ) + 1) * sizeof(WCHAR);
> +    ret = HeapAlloc( GetProcessHeap(), 0, size );
> +    if (ret) memcpy( ret, str, size );
> +    return ret;
> +}
> diff --git a/dlls/dsound/propset.c b/dlls/dsound/propset.c
> index b89c45ad90..9ef4ac9fbc 100644
> --- a/dlls/dsound/propset.c
> +++ b/dlls/dsound/propset.c
> @@ -200,7 +200,6 @@ static HRESULT DSPROPERTY_DescriptionW(
>      IMMDevice *mmdevice;
>      IPropertyStore *ps;
>      PROPVARIANT pv;
> -    DWORD desclen;
>      HRESULT hr;
>  
>      TRACE("pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
> @@ -248,12 +247,9 @@ static HRESULT DSPROPERTY_DescriptionW(
>          return hr;
>      }
>  
> -    desclen = lstrlenW(pv.u.pwszVal) + 1;
> -    /* FIXME: Still a memory leak.. */
> -    ppd->Description = HeapAlloc(GetProcessHeap(), 0, desclen * sizeof(WCHAR));
> -    memcpy(ppd->Description, pv.u.pwszVal, desclen * sizeof(WCHAR));
> -    ppd->Module = wine_vxd_drv;
> -    ppd->Interface = wInterface;
> +    ppd->Description = strdupW(pv.u.pwszVal);
> +    ppd->Module = strdupW(wine_vxd_drv);
> +    ppd->Interface = strdupW(wInterface);
>      ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
>  
>      PropVariantClear(&pv);
> @@ -463,6 +459,7 @@ static HRESULT DSPROPERTY_DescriptionA(
>          return hr;
>      if (!DSPROPERTY_descWtoA(&data, ppd))
>          hr = E_OUTOFMEMORY;
> +    HeapFree(GetProcessHeap(), 0, data.Description);
>      HeapFree(GetProcessHeap(), 0, data.Module);
>      HeapFree(GetProcessHeap(), 0, data.Interface);
>      return hr;
> @@ -488,6 +485,7 @@ static HRESULT DSPROPERTY_Description1(
>      if (FAILED(hr))
>          return hr;
>      DSPROPERTY_descWto1(&data, ppd);
> +    HeapFree(GetProcessHeap(), 0, data.Description);
>      HeapFree(GetProcessHeap(), 0, data.Module);
>      HeapFree(GetProcessHeap(), 0, data.Interface);
>      return hr;
> -- 
> 2.13.1
> 
> 
> 



More information about the wine-patches mailing list