Module: wine Branch: master Commit: 096e3063000609fbe8aa9f7a6afd088bc0bee009 URL: http://source.winehq.org/git/wine.git/?a=commit;h=096e3063000609fbe8aa9f7a6a...
Author: Christian Costa titan.costa@gmail.com Date: Mon Jan 23 21:37:32 2012 +0100
d3dxof: Fix object leak in error path by calling Release method which does all the work and simplify some inits for better readability.
---
dlls/d3dxof/d3dxof.c | 47 +++++++++++++++++++++-------------------------- 1 files changed, 21 insertions(+), 26 deletions(-)
diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c index 3a6ce20..38882a8 100644 --- a/dlls/d3dxof/d3dxof.c +++ b/dlls/d3dxof/d3dxof.c @@ -940,7 +940,6 @@ static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileE IDirectXFileEnumObjectImpl *This = impl_from_IDirectXFileEnumObject(iface); IDirectXFileDataImpl* object; HRESULT hr; - LPBYTE pstrings = NULL;
TRACE("(%p/%p)->(%p)\n", This, iface, ppDataObj);
@@ -963,33 +962,36 @@ static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileE if (FAILED(hr)) return hr;
- This->buf.pxo_globals = This->xobjects; - This->buf.nb_pxo_globals = This->nb_xobjects; - This->buf.level = 0; - This->buf.pdata = NULL; - This->buf.capacity = 0; - This->buf.cur_pos_data = 0; - - This->buf.pxo_tab = HeapAlloc(GetProcessHeap(), 0, sizeof(xobject)*MAX_SUBOBJECTS); - if (!This->buf.pxo_tab) + object->pobj = HeapAlloc(GetProcessHeap(), 0, sizeof(xobject)*MAX_SUBOBJECTS); + if (!object->pobj) { ERR("Out of memory\n"); hr = DXFILEERR_BADALLOC; goto error; } - This->buf.pxo = This->xobjects[This->nb_xobjects] = This->buf.pxo_tab;
- This->buf.pxo->pdata = NULL; - This->buf.pxo->nb_subobjects = 1; - - pstrings = HeapAlloc(GetProcessHeap(), 0, MAX_STRINGS_BUFFER); - if (!pstrings) + object->pstrings = HeapAlloc(GetProcessHeap(), 0, MAX_STRINGS_BUFFER); + if (!object->pstrings) { ERR("Out of memory\n"); hr = DXFILEERR_BADALLOC; goto error; } - This->buf.cur_pstrings = This->buf.pstrings = object->pstrings = pstrings; + + object->cur_enum_object = 0; + object->level = 0; + object->from_ref = FALSE; + + This->buf.pxo_globals = This->xobjects; + This->buf.nb_pxo_globals = This->nb_xobjects; + This->buf.level = 0; + This->buf.pdata = NULL; + This->buf.capacity = 0; + This->buf.cur_pos_data = 0; + This->buf.cur_pstrings = This->buf.pstrings = object->pstrings; + This->buf.pxo = This->xobjects[This->nb_xobjects] = This->buf.pxo_tab = object->pobj; + This->buf.pxo->pdata = NULL; + This->buf.pxo->nb_subobjects = 1;
if (!parse_object(&This->buf)) { @@ -998,12 +1000,6 @@ static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileE goto error; }
- object->pstrings = pstrings; - object->pobj = This->buf.pxo; - object->cur_enum_object = 0; - object->level = 0; - object->from_ref = FALSE; - *ppDataObj = (LPDIRECTXFILEDATA)object;
/* Get a reference to created object */ @@ -1016,9 +1012,8 @@ static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileE
error:
- HeapFree(GetProcessHeap(), 0, This->buf.pxo_tab); - HeapFree(GetProcessHeap(), 0, This->buf.pdata); - HeapFree(GetProcessHeap(), 0, pstrings); + IDirectXFileData_Release(&object->IDirectXFileData_iface); + *ppDataObj = NULL;
return hr; }