[PATCH] msacm32: Reference count local drivers.

Andrew Eikum aeikum at codeweavers.com
Thu Jan 10 10:42:08 CST 2019


Looks good to me, but I think it should be deferred until after 4.0
since it doesn't fix a regression.

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

On Wed, Jan 09, 2019 at 10:37:32PM +0800, Zhiyi Zhang wrote:
> One local driver can be assigned to multiple driver ids.
> When releasing the driver id, check if the reference count
> of a local driver is one before actually releasing the local driver.
> 
> Fix Kindred Spirits on the Roof (Steam ID: 402620) crashing
> at multiple places.
> 
> Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
> ---
>  dlls/msacm32/internal.c | 12 +++++++++++-
>  dlls/msacm32/wineacm.h  |  1 +
>  2 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/dlls/msacm32/internal.c b/dlls/msacm32/internal.c
> index aad071e8ad..7d324a8b27 100644
> --- a/dlls/msacm32/internal.c
> +++ b/dlls/msacm32/internal.c
> @@ -737,12 +737,17 @@ static PWINE_ACMLOCALDRIVER MSACM_pLastACMLocalDriver;
>  static PWINE_ACMLOCALDRIVER MSACM_UnregisterLocalDriver(PWINE_ACMLOCALDRIVER paldrv)
>  {
>      PWINE_ACMLOCALDRIVER pNextACMLocalDriver;
> +    LONG ref;
>  
>      if (paldrv->pACMInstList) {
>          ERR("local driver instances still present after closing all drivers - memory leak\n");
>          return NULL;
>      }
>  
> +    ref = InterlockedDecrement(&paldrv->ref);
> +    if (ref)
> +        return paldrv;
> +
>      if (paldrv == MSACM_pFirstACMLocalDriver)
>          MSACM_pFirstACMLocalDriver = paldrv->pNextACMLocalDrv;
>      if (paldrv == MSACM_pLastACMLocalDriver)
> @@ -883,7 +888,11 @@ PWINE_ACMLOCALDRIVER MSACM_RegisterLocalDriver(HMODULE hModule, DRIVERPROC lpDri
>      /* look up previous instance of local driver module */
>      for (paldrv = MSACM_pFirstACMLocalDriver; paldrv; paldrv = paldrv->pNextACMLocalDrv)
>      {
> -        if (paldrv->hModule == hModule && paldrv->lpDrvProc == lpDriverProc) return paldrv;
> +        if (paldrv->hModule == hModule && paldrv->lpDrvProc == lpDriverProc)
> +        {
> +            InterlockedIncrement(&paldrv->ref);
> +            return paldrv;
> +        }
>      }
>  
>      paldrv = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMLOCALDRIVER));
> @@ -892,6 +901,7 @@ PWINE_ACMLOCALDRIVER MSACM_RegisterLocalDriver(HMODULE hModule, DRIVERPROC lpDri
>      paldrv->hModule = hModule;
>      paldrv->lpDrvProc = lpDriverProc;
>      paldrv->pACMInstList = NULL;
> +    paldrv->ref = 1;
>  
>      paldrv->pNextACMLocalDrv = NULL;
>      paldrv->pPrevACMLocalDrv = MSACM_pLastACMLocalDriver;
> diff --git a/dlls/msacm32/wineacm.h b/dlls/msacm32/wineacm.h
> index 406e01bf21..98d1ab5a2c 100644
> --- a/dlls/msacm32/wineacm.h
> +++ b/dlls/msacm32/wineacm.h
> @@ -52,6 +52,7 @@ typedef struct _WINE_ACMLOCALDRIVER
>      PWINE_ACMLOCALDRIVERINST pACMInstList;
>      PWINE_ACMLOCALDRIVER pNextACMLocalDrv;
>      PWINE_ACMLOCALDRIVER pPrevACMLocalDrv;
> +    LONG                ref;
>  } WINE_ACMLOCALDRIVER;
>  
>  typedef struct _WINE_ACMLOCALDRIVERINST
> -- 
> 2.19.2
> 
> 
> 



More information about the wine-devel mailing list