=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: wined3d: Don' t modify existing data if set_private_data fails.

Alexandre Julliard julliard at winehq.org
Tue Mar 11 14:45:41 CDT 2014


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Mon Mar 10 23:43:08 2014 +0100

wined3d: Don't modify existing data if set_private_data fails.

---

 dlls/wined3d/resource.c |   13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 177d23e..04c3af4 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -211,7 +211,11 @@ HRESULT CDECL wined3d_resource_set_private_data(struct wined3d_resource *resourc
     TRACE("resource %p, riid %s, data %p, data_size %u, flags %#x.\n",
             resource, debugstr_guid(guid), data, data_size, flags);
 
-    wined3d_resource_free_private_data(resource, guid);
+    if (flags & WINED3DSPD_IUNKNOWN && data_size != sizeof(IUnknown *))
+    {
+        WARN("IUnknown data with size %u, returning WINED3DERR_INVALIDCALL.\n", data_size);
+        return WINED3DERR_INVALIDCALL;
+    }
 
     d = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*d));
     if (!d) return E_OUTOFMEMORY;
@@ -221,12 +225,6 @@ HRESULT CDECL wined3d_resource_set_private_data(struct wined3d_resource *resourc
 
     if (flags & WINED3DSPD_IUNKNOWN)
     {
-        if (data_size != sizeof(IUnknown *))
-        {
-            WARN("IUnknown data with size %u, returning WINED3DERR_INVALIDCALL.\n", data_size);
-            HeapFree(GetProcessHeap(), 0, d);
-            return WINED3DERR_INVALIDCALL;
-        }
         d->ptr.object = (IUnknown *)data;
         d->size = sizeof(IUnknown *);
         IUnknown_AddRef(d->ptr.object);
@@ -242,6 +240,7 @@ HRESULT CDECL wined3d_resource_set_private_data(struct wined3d_resource *resourc
         d->size = data_size;
         memcpy(d->ptr.data, data, data_size);
     }
+    wined3d_resource_free_private_data(resource, guid);
     list_add_tail(&resource->privateData, &d->entry);
 
     return WINED3D_OK;




More information about the wine-cvs mailing list