Module: wine Branch: master Commit: b42243e8e7d83ca0b6084ba8ab6c4303626588b0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b42243e8e7d83ca0b6084ba8ab...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Aug 31 20:47:55 2009 +0200
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 b4cfe3f..b8937e7 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 a93bdb0..d622239 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 0b95229..9e32b27 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 ba9a440..63fcb80 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 b73f865..ca7166c 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 da3027e..8637838 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 9b132b1..30fdac8 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 612dc2f..a993702 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 4f2a5de..d50eca1 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 db127b5..ecae0a5 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 6e912d3..207464f 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; }