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