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