From b42243e8e7d83ca0b6084ba8ab6c4303626588b0 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 31 Aug 2009 20:47:55 +0200 Subject: [PATCH] mshtml: Properly release DispatchEx data. --- dlls/mshtml/dispex.c | 31 +++++++++++++++++++++++++++++++ dlls/mshtml/htmlcurstyle.c | 1 + dlls/mshtml/htmldoc.c | 1 + dlls/mshtml/htmlelemcol.c | 1 + dlls/mshtml/htmlevent.c | 4 +++- dlls/mshtml/htmllocation.c | 1 + dlls/mshtml/htmlnode.c | 1 + dlls/mshtml/htmlstyle.c | 1 + dlls/mshtml/htmlwindow.c | 1 + dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/omnavigator.c | 4 +++- 11 files changed, 45 insertions(+), 2 deletions(-) diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index b4cfe3fab8e..b8937e7c29e 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -946,9 +946,40 @@ BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv) return TRUE; } +void release_dispex(DispatchEx *This) +{ + dynamic_prop_t *prop; + + if(!This->dynamic_data) + return; + + for(prop = This->dynamic_data->props; prop < This->dynamic_data->props + This->dynamic_data->prop_cnt; prop++) { + VariantClear(&prop->var); + heap_free(prop->name); + } + + heap_free(This->dynamic_data->props); + + if(This->dynamic_data->func_disps) { + unsigned i; + + for(i=0; i < This->data->data->func_disp_cnt; i++) { + if(This->dynamic_data->func_disps[i]) { + release_dispex(&This->dynamic_data->func_disps[i]->dispex); + heap_free(This->dynamic_data->func_disps[i]); + } + } + + heap_free(This->dynamic_data->func_disps); + } + + heap_free(This->dynamic_data); +} + void init_dispex(DispatchEx *dispex, IUnknown *outer, dispex_static_data_t *data) { dispex->lpIDispatchExVtbl = &DispatchExVtbl; dispex->outer = outer; dispex->data = data; + dispex->dynamic_data = NULL; } diff --git a/dlls/mshtml/htmlcurstyle.c b/dlls/mshtml/htmlcurstyle.c index a93bdb0f609..d622239816b 100644 --- a/dlls/mshtml/htmlcurstyle.c +++ b/dlls/mshtml/htmlcurstyle.c @@ -90,6 +90,7 @@ static ULONG WINAPI HTMLCurrentStyle_Release(IHTMLCurrentStyle *iface) if(!ref) { if(This->nsstyle) nsIDOMCSSStyleDeclaration_Release(This->nsstyle); + release_dispex(&This->dispex); heap_free(This); } diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 0b952293293..9e32b27707b 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -215,6 +215,7 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface) detach_selection(This); detach_ranges(This); release_nodes(This); + release_dispex(&This->dispex); ConnectionPointContainer_Destroy(&This->cp_container); diff --git a/dlls/mshtml/htmlelemcol.c b/dlls/mshtml/htmlelemcol.c index ba9a4402b88..63fcb80544a 100644 --- a/dlls/mshtml/htmlelemcol.c +++ b/dlls/mshtml/htmlelemcol.c @@ -132,6 +132,7 @@ static ULONG WINAPI HTMLElementCollection_Release(IHTMLElementCollection *iface) if(!ref) { IUnknown_Release(This->ref_unk); + release_dispex(&This->dispex); heap_free(This->elems); heap_free(This); } diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index b73f8658b40..ca7166c004f 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -176,8 +176,10 @@ static ULONG WINAPI HTMLEventObj_Release(IHTMLEventObj *iface) TRACE("(%p) ref=%d\n", This, ref); - if(!ref) + if(!ref) { + release_dispex(&This->dispex); heap_free(This); + } return ref; } diff --git a/dlls/mshtml/htmllocation.c b/dlls/mshtml/htmllocation.c index da3027e0d90..8637838b776 100644 --- a/dlls/mshtml/htmllocation.c +++ b/dlls/mshtml/htmllocation.c @@ -82,6 +82,7 @@ static ULONG WINAPI HTMLLocation_Release(IHTMLLocation *iface) if(!ref) { if(This->doc && This->doc->location == This) This->doc->location = NULL; + release_dispex(&This->dispex); heap_free(This); } diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index 9b132b16b98..30fdac87162 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -308,6 +308,7 @@ static ULONG WINAPI HTMLDOMNode_Release(IHTMLDOMNode *iface) if(!ref) { This->vtbl->destructor(This); + release_dispex(&This->dispex); heap_free(This); } diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c index 612dc2f2eaf..a993702eaea 100644 --- a/dlls/mshtml/htmlstyle.c +++ b/dlls/mshtml/htmlstyle.c @@ -554,6 +554,7 @@ static ULONG WINAPI HTMLStyle_Release(IHTMLStyle *iface) if(!ref) { if(This->nsstyle) nsIDOMCSSStyleDeclaration_Release(This->nsstyle); + release_dispex(&This->dispex); heap_free(This); } diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 4f2a5dead27..d50eca17758 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -93,6 +93,7 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface) if(!ref) { list_remove(&This->entry); + release_dispex(&This->dispex); heap_free(This); } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index db127b572d6..ecae0a55310 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -149,6 +149,7 @@ typedef struct { } DispatchEx; void init_dispex(DispatchEx*,IUnknown*,dispex_static_data_t*); +void release_dispex(DispatchEx*); BOOL dispex_query_interface(DispatchEx*,REFIID,void**); HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**); diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index 6e912d35e29..207464ffb4e 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -84,8 +84,10 @@ static ULONG WINAPI OmNavigator_Release(IOmNavigator *iface) TRACE("(%p) ref=%d\n", This, ref); - if(!ref) + if(!ref) { + release_dispex(&This->dispex); heap_free(This); + } return ref; } -- 2.11.4.GIT