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