Jacek Caban : mshtml: Properly release DispatchEx data.
Alexandre Julliard
julliard at winehq.org
Tue Sep 1 11:05:38 CDT 2009
Module: wine
Branch: master
Commit: b42243e8e7d83ca0b6084ba8ab6c4303626588b0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b42243e8e7d83ca0b6084ba8ab6c4303626588b0
Author: Jacek Caban <jacek at 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;
}
More information about the wine-cvs
mailing list