Henri Verbeet : ddraw: Check if the ddraw object still exists in d3d_device_inner_Release() ( Valgrind).

Alexandre Julliard julliard at wine.codeweavers.com
Thu Apr 30 07:19:29 CDT 2015


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Wed Apr 29 17:27:35 2015 +0200

ddraw: Check if the ddraw object still exists in d3d_device_inner_Release() (Valgrind).

---

 dlls/ddraw/ddraw.c  | 3 +++
 dlls/ddraw/device.c | 5 ++++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index ffffa9c..b3caba2 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -435,6 +435,9 @@ static void ddraw_destroy(struct ddraw *This)
     wined3d_device_decref(This->wined3d_device);
     wined3d_decref(This->wined3d);
 
+    if (This->d3ddevice)
+        This->d3ddevice->ddraw = NULL;
+
     /* Now free the object */
     HeapFree(GetProcessHeap(), 0, This);
 }
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index f0f4ac3..bc19897 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -316,7 +316,10 @@ static ULONG WINAPI d3d_device_inner_Release(IUnknown *iface)
             IUnknown_Release(rt_iface);
         TRACE("Render target release done.\n");
 
-        This->ddraw->d3ddevice = NULL;
+        /* Releasing the render target above may have released the last
+         * reference to the ddraw object. */
+        if (This->ddraw)
+            This->ddraw->d3ddevice = NULL;
 
         /* Now free the structure */
         HeapFree(GetProcessHeap(), 0, This);




More information about the wine-cvs mailing list