Daniel Lehman : msxml3: Fix crash when merging Text nodes.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Aug 18 09:22:16 CDT 2015
Module: wine
Branch: master
Commit: 1f7fb03ee9f45217e6fea452c203ba625401d8ee
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1f7fb03ee9f45217e6fea452c203ba625401d8ee
Author: Daniel Lehman <dlehman at esri.com>
Date: Wed Aug 12 12:46:44 2015 -0700
msxml3: Fix crash when merging Text nodes.
---
dlls/msxml3/node.c | 4 +--
dlls/msxml3/tests/domdoc.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 90b5bde..f8d7761 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -496,7 +496,7 @@ HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT
refcount = xmlnode_get_inst_cnt(node_obj);
if (refcount) xmldoc_add_refs(before_node_obj->node->doc, refcount);
- xmlAddPrevSibling(before_node_obj->node, node_obj->node);
+ node_obj->node = xmlAddPrevSibling(before_node_obj->node, node_obj->node);
if (refcount) xmldoc_release_refs(doc, refcount);
node_obj->parent = This->parent;
}
@@ -508,7 +508,7 @@ HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT
if (refcount) xmldoc_add_refs(This->node->doc, refcount);
/* xmlAddChild doesn't unlink node from previous parent */
xmlUnlinkNode(node_obj->node);
- xmlAddChild(This->node, node_obj->node);
+ node_obj->node = xmlAddChild(This->node, node_obj->node);
if (refcount) xmldoc_release_refs(doc, refcount);
node_obj->parent = This->iface;
}
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index df71b49..ff6783b 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -11935,6 +11935,71 @@ static void test_url(void)
IXMLDOMDocument_Release(doc);
}
+static void test_merging_text(void)
+{
+ IXMLDOMText *nodetext;
+ IXMLDOMText *newtext;
+ IXMLDOMElement *root;
+ IXMLDOMDocument *doc;
+ IXMLDOMNode *first;
+ HRESULT hr;
+ VARIANT v;
+ BSTR str;
+ int i;
+
+ doc = create_document(&IID_IXMLDOMDocument);
+
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &root);
+ EXPECT_HR(hr, S_OK);
+
+ hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL);
+ EXPECT_HR(hr, S_OK);
+
+ /* test xmlAddChild */
+ for (i = 0; i < 10; i++)
+ {
+ str = SysAllocString(szstr1);
+ hr = IXMLDOMDocument_createTextNode(doc, str, &nodetext);
+ SysFreeString(str);
+ EXPECT_HR(hr, S_OK);
+
+ newtext = NULL;
+ hr = IXMLDOMElement_appendChild(root, (IXMLDOMNode*)nodetext, (IXMLDOMNode**)&newtext);
+ EXPECT_HR(hr, S_OK);
+ ok(nodetext == newtext, "expected %p, got %p\n", nodetext, newtext);
+
+ IXMLDOMText_Release(newtext);
+ IXMLDOMText_Release(nodetext);
+ }
+
+ /* test xmlAddPrevSibling */
+ hr = IXMLDOMElement_get_firstChild(root, &first);
+ EXPECT_HR(hr, S_OK);
+ V_VT(&v) = VT_UNKNOWN;
+ V_UNKNOWN(&v) = (IUnknown*)first;
+ for (i = 0; i < 10; i++)
+ {
+ str = SysAllocString(szstr2);
+ hr = IXMLDOMDocument_createTextNode(doc, str, &nodetext);
+ SysFreeString(str);
+ EXPECT_HR(hr, S_OK);
+
+ newtext = NULL;
+ hr = IXMLDOMElement_insertBefore(root, (IXMLDOMNode*)nodetext, v, (IXMLDOMNode**)&newtext);
+ EXPECT_HR(hr, S_OK);
+ ok(nodetext == newtext, "expected %p, got %p\n", nodetext, newtext);
+
+ IXMLDOMText_Release(newtext);
+ IXMLDOMText_Release(nodetext);
+ }
+
+ IXMLDOMNode_Release(first);
+ IXMLDOMElement_Release(root);
+ IXMLDOMDocument_Release(doc);
+
+ free_bstrs();
+}
+
START_TEST(domdoc)
{
HRESULT hr;
@@ -12014,6 +12079,7 @@ START_TEST(domdoc)
test_namedmap_newenum();
test_xmlns_attribute();
test_url();
+ test_merging_text();
test_xsltemplate();
test_xsltext();
More information about the wine-cvs
mailing list