Module: wine Branch: master Commit: c43bf14569cc2c76ad1c62bc81166667ab89ebdc URL: http://source.winehq.org/git/wine.git/?a=commit;h=c43bf14569cc2c76ad1c62bc81...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Jul 31 13:10:14 2013 +0200
oleaut32: Fix ICreateTypeInfo2_fnAddVarDesc implementation.
---
dlls/oleaut32/typelib.c | 30 +++++++++++++++++++----------- 1 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index a8916d8..973f453 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -101,6 +101,7 @@ typedef struct
static HRESULT typedescvt_to_variantvt(ITypeInfo *tinfo, const TYPEDESC *tdesc, VARTYPE *vt); static HRESULT TLB_AllocAndInitVarDesc(const VARDESC *src, VARDESC **dest_ptr); +static void TLB_FreeVarDesc(VARDESC*);
/**************************************************************************** * FromLExxx @@ -1118,8 +1119,9 @@ typedef struct tagTLBFuncDesc /* internal Variable data */ typedef struct tagTLBVarDesc { - VARDESC vardesc; /* lots of info on the variable and its attributes. */ - const TLBString *Name; /* the name of this variable */ + VARDESC vardesc; /* lots of info on the variable and its attributes. */ + VARDESC *vardesc_create; /* additional data needed for storing VARDESC */ + const TLBString *Name; /* the name of this variable */ int HelpContext; int HelpStringContext; const TLBString *HelpString; @@ -5453,8 +5455,9 @@ static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This) for(i = 0; i < This->cVars; ++i) { TLBVarDesc *pVInfo = &This->vardescs[i]; - if (pVInfo->vardesc.varkind == VAR_CONST) - { + if (pVInfo->vardesc_create) { + TLB_FreeVarDesc(pVInfo->vardesc_create); + } else if (pVInfo->vardesc.varkind == VAR_CONST) { VariantClear(pVInfo->vardesc.u.lpvarValue); heap_free(pVInfo->vardesc.u.lpvarValue); } @@ -5720,6 +5723,14 @@ static HRESULT TLB_AllocAndInitFuncDesc( const FUNCDESC *src, FUNCDESC **dest_pt return S_OK; }
+static void TLB_FreeVarDesc(VARDESC *var_desc) +{ + TLB_FreeElemDesc(&var_desc->elemdescVar); + if (var_desc->varkind == VAR_CONST) + VariantClear(var_desc->u.lpvarValue); + SysFreeString((BSTR)var_desc); +} + HRESULT ITypeInfoImpl_GetInternalFuncDesc( ITypeInfo *iface, UINT index, const FUNCDESC **ppFuncDesc ) { ITypeInfoImpl *This = impl_from_ITypeInfo(iface); @@ -7690,10 +7701,7 @@ static void WINAPI ITypeInfo_fnReleaseVarDesc( ITypeInfo2 *iface, ITypeInfoImpl *This = impl_from_ITypeInfo2(iface); TRACE("(%p)->(%p)\n", This, pVarDesc);
- TLB_FreeElemDesc(&pVarDesc->elemdescVar); - if (pVarDesc->varkind == VAR_CONST) - VariantClear(pVarDesc->u.lpvarValue); - SysFreeString((BSTR)pVarDesc); + TLB_FreeVarDesc(pVarDesc); }
/* ITypeInfo2::GetTypeKind @@ -10430,11 +10438,11 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(ICreateTypeInfo2 *iface, } } } else - var_desc = This->vardescs = heap_alloc(sizeof(TLBVarDesc)); + var_desc = This->vardescs = heap_alloc_zero(sizeof(TLBVarDesc));
- memset(var_desc, 0, sizeof(TLBVarDesc)); TLBVarDesc_Constructor(var_desc); - var_desc->vardesc = *varDesc; + TLB_AllocAndInitVarDesc(varDesc, &var_desc->vardesc_create); + var_desc->vardesc = *var_desc->vardesc_create;
++This->cVars;