Nikolay Sivov : msxml3: Don't try to use null interface pointer.

Alexandre Julliard julliard at winehq.org
Mon Oct 24 13:43:54 CDT 2011


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Oct 22 21:22:05 2011 +0400

msxml3: Don't try to use null interface pointer.

---

 dlls/msxml3/node.c         |    7 +++++--
 dlls/msxml3/tests/domdoc.c |   20 ++++++++++++++++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 681cd44..7219bd3 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -311,8 +311,11 @@ HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT
 
     case VT_UNKNOWN:
     case VT_DISPATCH:
-        hr = IUnknown_QueryInterface(V_UNKNOWN(ref_child), &IID_IXMLDOMNode, (void**)&before);
-        if(FAILED(hr)) return hr;
+        if (V_UNKNOWN(ref_child))
+        {
+            hr = IUnknown_QueryInterface(V_UNKNOWN(ref_child), &IID_IXMLDOMNode, (void**)&before);
+            if(FAILED(hr)) return hr;
+        }
         break;
 
     default:
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index a758880..c12aa5c 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -9341,12 +9341,32 @@ static void test_insertBefore(void)
     hr = IXMLDOMDocument_createElement(doc, _bstr_("elem3"), &elem3);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
+    hr = IXMLDOMDocument_createElement(doc, _bstr_("elem3"), &elem3);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IXMLDOMDocument_createElement(doc, _bstr_("elem4"), &elem4);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
     EXPECT_NO_CHILDREN(elem1);
     EXPECT_NO_CHILDREN(elem2);
     EXPECT_NO_CHILDREN(elem3);
 
     todo_wine EXPECT_REF(elem2, 2);
 
+    V_VT(&v) = VT_DISPATCH;
+    V_DISPATCH(&v) = NULL;
+    node = NULL;
+    hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)elem4, v, &node);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(node == (void*)elem4, "got %p\n", node);
+
+    EXPECT_CHILDREN(elem1);
+    hr = IXMLDOMElement_removeChild(elem1, (IXMLDOMNode*)elem4, NULL);
+    EXPECT_HR(hr, S_OK);
+    IXMLDOMElement_Release(elem4);
+
+    EXPECT_NO_CHILDREN(elem1);
+
     V_VT(&v) = VT_NULL;
     node = NULL;
     hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)elem2, v, &node);




More information about the wine-cvs mailing list