Nikolay Sivov : msxml3: Null pointer for schema uri should be treated as empty.

Alexandre Julliard julliard at winehq.org
Thu Feb 17 13:06:33 CST 2011


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Feb 17 01:42:15 2011 +0300

msxml3: Null pointer for schema uri should be treated as empty.

---

 dlls/msxml3/schema.c       |   18 ++++++++++--------
 dlls/msxml3/tests/schema.c |   36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/dlls/msxml3/schema.c b/dlls/msxml3/schema.c
index fa4208d..9239326 100644
--- a/dlls/msxml3/schema.c
+++ b/dlls/msxml3/schema.c
@@ -63,11 +63,13 @@ static const xmlChar XDR_schema[] = "Schema";
 static const xmlChar XDR_nsURI[] = "urn:schemas-microsoft-com:xml-data";
 static const xmlChar DT_nsURI[] = "urn:schemas-microsoft-com:datatypes";
 
-static xmlChar const*   datatypes_src = NULL;
-static int              datatypes_len = 0;
-static HGLOBAL          datatypes_handle = NULL;
-static HRSRC            datatypes_rsrc = NULL;
-static xmlSchemaPtr     datatypes_schema = NULL;
+static xmlChar const*   datatypes_src;
+static int              datatypes_len;
+static HGLOBAL          datatypes_handle;
+static HRSRC            datatypes_rsrc;
+static xmlSchemaPtr     datatypes_schema;
+
+static const WCHAR      emptyW[] = {0};
 
 /* Supported Types:
  * msxml3 - XDR only
@@ -1057,7 +1059,7 @@ static HRESULT WINAPI schema_cache_Invoke(IXMLDOMSchemaCollection2* iface,
 static HRESULT WINAPI schema_cache_add(IXMLDOMSchemaCollection2* iface, BSTR uri, VARIANT var)
 {
     schema_cache* This = impl_from_IXMLDOMSchemaCollection2(iface);
-    xmlChar* name = xmlChar_from_wchar(uri);
+    xmlChar* name = uri ? xmlChar_from_wchar(uri) : xmlChar_from_wchar(emptyW);
     TRACE("(%p)->(%s, var(vt %x))\n", This, debugstr_w(uri), V_VT(&var));
 
     switch (V_VT(&var))
@@ -1158,7 +1160,7 @@ static HRESULT WINAPI schema_cache_get(IXMLDOMSchemaCollection2* iface, BSTR uri
     if (!node)
         return E_POINTER;
 
-    name = xmlChar_from_wchar(uri);
+    name = uri ? xmlChar_from_wchar(uri) : xmlChar_from_wchar(emptyW);
     entry = (cache_entry*) xmlHashLookup(This->cache, name);
     heap_free(name);
 
@@ -1173,7 +1175,7 @@ static HRESULT WINAPI schema_cache_get(IXMLDOMSchemaCollection2* iface, BSTR uri
 static HRESULT WINAPI schema_cache_remove(IXMLDOMSchemaCollection2* iface, BSTR uri)
 {
     schema_cache* This = impl_from_IXMLDOMSchemaCollection2(iface);
-    xmlChar* name = xmlChar_from_wchar(uri);
+    xmlChar* name = uri ? xmlChar_from_wchar(uri) : xmlChar_from_wchar(emptyW);
     TRACE("(%p)->(%s)\n", This, wine_dbgstr_w(uri));
 
     xmlHashRemoveEntry(This->cache, name, cache_free);
diff --git a/dlls/msxml3/tests/schema.c b/dlls/msxml3/tests/schema.c
index 2b20603..56a77e6 100644
--- a/dlls/msxml3/tests/schema.c
+++ b/dlls/msxml3/tests/schema.c
@@ -493,11 +493,14 @@ static void* _create_object(const GUID *clsid, const char *name, const IID *iid,
 
 static void test_schema_refs(void)
 {
+    static const WCHAR emptyW[] = {0};
     IXMLDOMDocument2 *doc;
+    IXMLDOMNode *node;
     IXMLDOMSchemaCollection *cache;
     VARIANT v;
     VARIANT_BOOL b;
     BSTR str;
+    LONG len;
 
     doc = create_document(&IID_IXMLDOMDocument2);
     if (!doc)
@@ -516,6 +519,39 @@ static void test_schema_refs(void)
     ok(b == VARIANT_TRUE, "b %04x\n", b);
     SysFreeString(str);
 
+    node = (void*)0xdeadbeef;
+    ole_check(IXMLDOMSchemaCollection_get(cache, NULL, &node));
+    ok(node == NULL, "%p\n", node);
+
+    /* NULL uri pointer, still adds a document */
+    ole_check(IXMLDOMSchemaCollection_add(cache, NULL, _variantdoc_(doc)));
+    len = -1;
+    ole_check(IXMLDOMSchemaCollection_get_length(cache, &len));
+    ok(len == 1, "got %d\n", len);
+    /* read back - empty valid BSTR */
+    str = NULL;
+    ole_check(IXMLDOMSchemaCollection_get_namespaceURI(cache, 0, &str));
+    ok(str && *str == 0, "got %p\n", str);
+    SysFreeString(str);
+
+    node = NULL;
+    ole_check(IXMLDOMSchemaCollection_get(cache, NULL, &node));
+    ok(node != NULL, "%p\n", node);
+    IXMLDOMNode_Release(node);
+
+    node = NULL;
+    str = SysAllocString(emptyW);
+    ole_check(IXMLDOMSchemaCollection_get(cache, str, &node));
+    ok(node != NULL, "%p\n", node);
+    IXMLDOMNode_Release(node);
+    SysFreeString(str);
+
+    /* remove with NULL uri */
+    ole_check(IXMLDOMSchemaCollection_remove(cache, NULL));
+    len = -1;
+    ole_check(IXMLDOMSchemaCollection_get_length(cache, &len));
+    ok(len == 0, "got %d\n", len);
+
     str = SysAllocString(xdr_schema_uri);
     ole_check(IXMLDOMSchemaCollection_add(cache, str, _variantdoc_(doc)));
 




More information about the wine-cvs mailing list