Nikolay Sivov : msxml3: Release IDispatchEx dynamic data properly.
Module: wine Branch: master Commit: a35513bbd07d7630d4d3c2e889b780374886cbe8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a35513bbd07d7630d4d3c2e889... Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Sun Oct 30 01:27:50 2011 +0400 msxml3: Release IDispatchEx dynamic data properly. --- dlls/msxml3/dispex.c | 16 ++++++++++++++++ dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 6 ++---- dlls/msxml3/selection.c | 9 +++++---- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/dlls/msxml3/dispex.c b/dlls/msxml3/dispex.c index 67570c0..274f604 100644 --- a/dlls/msxml3/dispex.c +++ b/dlls/msxml3/dispex.c @@ -653,6 +653,22 @@ 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); + heap_free(This->dynamic_data); +} + void init_dispex(DispatchEx *dispex, IUnknown *outer, dispex_static_data_t *data) { dispex->IDispatchEx_iface.lpVtbl = &DispatchExVtbl; diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 2962a0e..8b84aca 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -156,6 +156,7 @@ typedef struct { extern HINSTANCE MSXML_hInstance DECLSPEC_HIDDEN; void init_dispex(DispatchEx*,IUnknown*,dispex_static_data_t*) DECLSPEC_HIDDEN; +void release_dispex(DispatchEx*) DECLSPEC_HIDDEN; BOOL dispex_query_interface(DispatchEx*,REFIID,void**) DECLSPEC_HIDDEN; /* memory allocation functions */ diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 7219bd3..0e00b38 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -1110,6 +1110,7 @@ void destroy_xmlnode(xmlnode *This) { if(This->node) xmldoc_release(This->node->doc); + release_dispex(&This->dispex); } void init_xmlnode(xmlnode *This, xmlNodePtr node, IXMLDOMNode *node_iface, dispex_static_data_t *dispex_data) @@ -1121,10 +1122,7 @@ void init_xmlnode(xmlnode *This, xmlNodePtr node, IXMLDOMNode *node_iface, dispe This->iface = node_iface; This->parent = NULL; - if(dispex_data) - init_dispex(&This->dispex, (IUnknown*)This->iface, dispex_data); - else - This->dispex.outer = NULL; + init_dispex(&This->dispex, dispex_data ? (IUnknown*)This->iface : NULL, dispex_data); } typedef struct { diff --git a/dlls/msxml3/selection.c b/dlls/msxml3/selection.c index c90c8c2..0e62a68 100644 --- a/dlls/msxml3/selection.c +++ b/dlls/msxml3/selection.c @@ -155,6 +155,7 @@ static ULONG WINAPI domselection_Release( xmlXPathFreeObject(This->result); xmldoc_release(This->node->doc); if (This->enumvariant) IEnumVARIANT_Release(This->enumvariant); + release_dispex(&This->dispex); heap_free(This); } @@ -756,8 +757,9 @@ HRESULT create_selection(xmlNodePtr node, xmlChar* query, IXMLDOMNodeList **out) *out = NULL; if (!This || !ctxt || !query) { - hr = E_OUTOFMEMORY; - goto cleanup; + xmlXPathFreeContext(ctxt); + heap_free(This); + return E_OUTOFMEMORY; } This->IXMLDOMSelection_iface.lpVtbl = &domselection_vtbl; @@ -765,6 +767,7 @@ HRESULT create_selection(xmlNodePtr node, xmlChar* query, IXMLDOMNodeList **out) This->resultPos = 0; This->node = node; This->enumvariant = NULL; + init_dispex(&This->dispex, (IUnknown*)&This->IXMLDOMSelection_iface, &domselection_dispex); xmldoc_add_ref(This->node->doc); ctxt->error = query_serror; @@ -804,8 +807,6 @@ HRESULT create_selection(xmlNodePtr node, xmlChar* query, IXMLDOMNodeList **out) goto cleanup; } - init_dispex(&This->dispex, (IUnknown*)&This->IXMLDOMSelection_iface, &domselection_dispex); - *out = (IXMLDOMNodeList*)&This->IXMLDOMSelection_iface; hr = S_OK; TRACE("found %d matches\n", xmlXPathNodeSetGetLength(This->result->nodesetval));
participants (1)
-
Alexandre Julliard