Nikolay Sivov : msxml3/xmldoc: Don' t leak document and stream on next IXMLDocument::Load().

Alexandre Julliard julliard at winehq.org
Thu Jan 14 11:33:36 CST 2010


Module: wine
Branch: master
Commit: 1cad1646e5b0081ed2d9292c12a4f1575bece45d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1cad1646e5b0081ed2d9292c12a4f1575bece45d

Author: Nikolay Sivov <bunglehead at gmail.com>
Date:   Wed Jan 13 00:33:03 2010 +0300

msxml3/xmldoc: Don't leak document and stream on next IXMLDocument::Load().

---

 dlls/msxml3/tests/xmldoc.c |    8 ++++++++
 dlls/msxml3/xmldoc.c       |    6 ++++++
 2 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/dlls/msxml3/tests/xmldoc.c b/dlls/msxml3/tests/xmldoc.c
index 9611f7c..7cc6cd5 100644
--- a/dlls/msxml3/tests/xmldoc.c
+++ b/dlls/msxml3/tests/xmldoc.c
@@ -431,6 +431,14 @@ static void test_persiststreaminit(void)
     hr = IPersistStreamInit_IsDirty(psi);
     todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr);
 
+    create_stream_on_file(&stream, path);
+    hr = IPersistStreamInit_Load(psi, stream);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    IStream_Release(stream);
+
+    hr = IPersistStreamInit_IsDirty(psi);
+    todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr);
+
     /* reset internal stream */
     hr = IPersistStreamInit_InitNew(psi);
     ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
diff --git a/dlls/msxml3/xmldoc.c b/dlls/msxml3/xmldoc.c
index 2ca874b..cf39cc5 100644
--- a/dlls/msxml3/xmldoc.c
+++ b/dlls/msxml3/xmldoc.c
@@ -616,6 +616,8 @@ static HRESULT WINAPI xmldoc_IPersistStreamInit_Load(
     if (!pStm)
         return E_INVALIDARG;
 
+    /* release previously allocated stream */
+    if (This->stream) IStream_Release(This->stream);
     hr = CreateStreamOnHGlobal(NULL, TRUE, &This->stream);
     if (FAILED(hr))
         return hr;
@@ -639,7 +641,10 @@ static HRESULT WINAPI xmldoc_IPersistStreamInit_Load(
     len = GlobalSize(hglobal);
     ptr = GlobalLock(hglobal);
     if (len != 0)
+    {
+        xmlFreeDoc(This->xmldoc);
         This->xmldoc = parse_xml(ptr, len);
+    }
     GlobalUnlock(hglobal);
 
     if (!This->xmldoc)
@@ -648,6 +653,7 @@ static HRESULT WINAPI xmldoc_IPersistStreamInit_Load(
         return E_FAIL;
     }
 
+    if (This->root) IXMLElement_Release(This->root);
     xmlnode = xmlDocGetRootElement(This->xmldoc);
     return XMLElement_create((IUnknown *)This, xmlnode, (LPVOID *)&This->root);
 }




More information about the wine-cvs mailing list