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