[PATCH 2/5] dxgi: Free the wined3d object when device creation fails (Valgrind).

Henri Verbeet hverbeet at gmail.com
Wed Aug 27 12:22:25 CDT 2014


On 27 August 2014 18:40, Matteo Bruni <mbruni at codeweavers.com> wrote:
> ---
>  dlls/dxgi/device.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c
> index 837c57f..0f3ae7d 100644
> --- a/dlls/dxgi/device.c
> +++ b/dlls/dxgi/device.c
> @@ -350,7 +350,7 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l
>      IWineDXGIDeviceParent *dxgi_device_parent;
>      IWineDXGIAdapter *wine_adapter;
>      UINT adapter_ordinal;
> -    struct wined3d *wined3d;
> +    struct wined3d *wined3d = NULL;
>      void *layer_base;
>      HRESULT hr;
>      WINED3DCAPS caps;
> @@ -430,6 +430,12 @@ fail:
>          wined3d_device_decref(device->wined3d_device);
>          LeaveCriticalSection(&dxgi_cs);
>      }
> +    else if (wined3d)
> +    {
> +        EnterCriticalSection(&dxgi_cs);
> +        wined3d_decref(wined3d);
> +        LeaveCriticalSection(&dxgi_cs);
> +    }

I don't think this works as intended. For example, if
IDXGIAdapter_QueryInterface() fails, you'd call wined3d_decref()
twice. There's also a wined3d_decref() after wined3d_device_create(),
although it's indeed missing for IWineDXGIDevice_QueryInterface() and
wined3d_get_device_caps().



More information about the wine-devel mailing list