Matteo Bruni : d3dx9: Release child mesh objects (Valgrind).

Alexandre Julliard julliard at wine.codeweavers.com
Tue Aug 26 15:20:29 CDT 2014


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

Author: Matteo Bruni <mbruni at codeweavers.com>
Date:   Tue Aug 26 16:13:07 2014 +0200

d3dx9: Release child mesh objects (Valgrind).

---

 dlls/d3dx9_36/mesh.c  | 51 +++++++++++++++++++++++++++++++++++++++------------
 dlls/d3dx9_36/xfile.c | 12 +++++++++---
 2 files changed, 48 insertions(+), 15 deletions(-)

diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c
index dfaf722..1046ff9 100644
--- a/dlls/d3dx9_36/mesh.c
+++ b/dlls/d3dx9_36/mesh.c
@@ -2751,16 +2751,20 @@ static HRESULT parse_material(ID3DXFileData *filedata, D3DXMATERIAL *material)
             return hr;
         hr = child->lpVtbl->GetType(child, &type);
         if (FAILED(hr))
-            return hr;
+            goto err;
 
         if (IsEqualGUID(&type, &TID_D3DRMTextureFilename)) {
             hr = parse_texture_filename(child, &material->pTextureFilename);
             if (FAILED(hr))
-                return hr;
+                goto err;
         }
+        IUnknown_Release(child);
     }
-
     return D3D_OK;
+
+err:
+    IUnknown_Release(child);
+    return hr;
 }
 
 static void destroy_materials(struct mesh_data *mesh)
@@ -2781,7 +2785,7 @@ static HRESULT parse_material_list(ID3DXFileData *filedata, struct mesh_data *me
     SIZE_T data_size;
     const DWORD *data, *in_ptr;
     GUID type;
-    ID3DXFileData *child;
+    ID3DXFileData *child = NULL;
     DWORD num_materials;
     DWORD i;
     SIZE_T nb_children;
@@ -2864,6 +2868,9 @@ static HRESULT parse_material_list(ID3DXFileData *filedata, struct mesh_data *me
             if (FAILED(hr))
                 goto end;
         }
+
+        IUnknown_Release(child);
+        child = NULL;
     }
     if (num_materials != mesh->num_materials) {
         WARN("only %u of %u materials defined\n", num_materials, mesh->num_materials);
@@ -2871,6 +2878,8 @@ static HRESULT parse_material_list(ID3DXFileData *filedata, struct mesh_data *me
     }
 
 end:
+    if (child)
+        IUnknown_Release(child);
     filedata->lpVtbl->Unlock(filedata);
     return hr;
 }
@@ -3168,7 +3177,7 @@ static HRESULT parse_mesh(ID3DXFileData *filedata, struct mesh_data *mesh_data,
     const BYTE *data, *in_ptr;
     DWORD *index_out_ptr;
     GUID type;
-    ID3DXFileData *child;
+    ID3DXFileData *child = NULL;
     DWORD i;
     SIZE_T nb_children;
     DWORD nb_skin_weigths_info = 0;
@@ -3316,6 +3325,9 @@ static HRESULT parse_mesh(ID3DXFileData *filedata, struct mesh_data *mesh_data,
         }
         if (FAILED(hr))
             goto end;
+
+        IUnknown_Release(child);
+        child = NULL;
     }
 
     if (mesh_data->skin_info && (nb_skin_weigths_info != mesh_data->nb_bones)) {
@@ -3328,6 +3340,8 @@ static HRESULT parse_mesh(ID3DXFileData *filedata, struct mesh_data *mesh_data,
     hr = D3D_OK;
 
 end:
+    if (child)
+        IUnknown_Release(child);
     filedata->lpVtbl->Unlock(filedata);
     return hr;
 }
@@ -3856,7 +3870,7 @@ static HRESULT load_frame(struct ID3DXFileData *filedata, DWORD options, struct
             return hr;
         hr = child->lpVtbl->GetType(child, &type);
         if (FAILED(hr))
-            return hr;
+            goto err;
 
         if (IsEqualGUID(&type, &TID_D3DRMMesh)) {
             hr = load_mesh_container(child, options, device, alloc_hier, next_container);
@@ -3870,10 +3884,15 @@ static HRESULT load_frame(struct ID3DXFileData *filedata, DWORD options, struct
                 next_child = &(*next_child)->pFrameSibling;
         }
         if (FAILED(hr))
-            return hr;
-    }
+            goto err;
 
+        IUnknown_Release(child);
+    }
     return D3D_OK;
+
+err:
+    IUnknown_Release(child);
+    return hr;
 }
 
 HRESULT WINAPI D3DXLoadMeshHierarchyFromXInMemory(const void *memory, DWORD memory_size, DWORD options,
@@ -4139,12 +4158,15 @@ static HRESULT parse_frame(struct ID3DXFileData *filedata, DWORD options, struct
             return hr;
         hr = child->lpVtbl->GetType(child, &type);
         if (FAILED(hr))
-            return hr;
+            goto err;
 
         if (IsEqualGUID(&type, &TID_D3DRMMesh)) {
             struct mesh_container *container = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*container));
             if (!container)
-                return E_OUTOFMEMORY;
+            {
+                hr = E_OUTOFMEMORY;
+                goto err;
+            }
             list_add_tail(container_list, &container->entry);
             container->transform = transform;
 
@@ -4160,10 +4182,15 @@ static HRESULT parse_frame(struct ID3DXFileData *filedata, DWORD options, struct
             hr = parse_frame(child, options, device, &transform, container_list, provide_flags);
         }
         if (FAILED(hr))
-            return hr;
-    }
+            goto err;
 
+        IUnknown_Release(child);
+    }
     return D3D_OK;
+
+err:
+    IUnknown_Release(child);
+    return hr;
 }
 
 HRESULT WINAPI D3DXLoadMeshFromXInMemory(const void *memory, DWORD memory_size, DWORD options,
diff --git a/dlls/d3dx9_36/xfile.c b/dlls/d3dx9_36/xfile.c
index 84e480c..f5f3bae 100644
--- a/dlls/d3dx9_36/xfile.c
+++ b/dlls/d3dx9_36/xfile.c
@@ -19,6 +19,7 @@
 
 #include "wine/debug.h"
 
+#define COBJMACROS
 #include "d3dx9.h"
 #include "d3dx9xof.h"
 #undef MAKE_DDHRESULT
@@ -319,6 +320,7 @@ static HRESULT d3dx9_file_data_create(IDirectXFileObject *dxfile_object, ID3DXFi
         if (SUCCEEDED(ret))
         {
             ret = IDirectXFileDataReference_Resolve(reference, &object->dxfile_data);
+            IUnknown_Release(reference);
             if (FAILED(ret))
             {
                 HeapFree(GetProcessHeap(), 0, object);
@@ -345,7 +347,9 @@ static HRESULT d3dx9_file_data_create(IDirectXFileObject *dxfile_object, ID3DXFi
             ret = E_OUTOFMEMORY;
             break;
         }
-        if (FAILED(ret = d3dx9_file_data_create(data_object, &object->children[object->nb_children])))
+        ret = d3dx9_file_data_create(data_object, &object->children[object->nb_children]);
+        IUnknown_Release(data_object);
+        if (FAILED(ret))
             break;
         object->nb_children++;
     }
@@ -599,8 +603,10 @@ static HRESULT WINAPI d3dx9_file_CreateEnumObject(ID3DXFile *iface, const void *
             ret = E_OUTOFMEMORY;
             break;
         }
-        if (FAILED(ret = d3dx9_file_data_create((IDirectXFileObject*)data_object,
-                &object->children[object->nb_children])))
+        ret = d3dx9_file_data_create((IDirectXFileObject*)data_object,
+                &object->children[object->nb_children]);
+        IUnknown_Release(data_object);
+        if (FAILED(ret))
             break;
         object->nb_children++;
     }




More information about the wine-cvs mailing list