Module: wine Branch: master Commit: 1cad1646e5b0081ed2d9292c12a4f1575bece45d URL: http://source.winehq.org/git/wine.git/?a=commit;h=1cad1646e5b0081ed2d9292c12...
Author: Nikolay Sivov bunglehead@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); }