[PATCH 0/6] MR10740: msxml3: Improvements to node name validation.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10740
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 85 +++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 6 deletions(-) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 30de48ea6f9..b3867464c67 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -2052,12 +2052,6 @@ if (0) ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); ok(nodeChild == NULL, "pLastChild not NULL\n"); - /* baseName */ - str = (void *)0xdeadbeef; - hr = IXMLDOMComment_get_baseName(node_comment, &str); - ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); - ok(str == NULL, "Expected NULL\n"); - IXMLDOMComment_Release( node_comment ); } @@ -7065,6 +7059,7 @@ static void test_put_nodeValue(void) IXMLDOMNode *node; HRESULT hr; VARIANT data, type; + BSTR str; doc = create_document(&IID_IXMLDOMDocument); @@ -7083,6 +7078,10 @@ static void test_put_nodeValue(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr ); hr = IXMLDOMNode_put_nodeValue(node, _variantbstr_("one two three")); ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr ); + str = (void *)0x1; + hr = IXMLDOMNode_get_baseName(node, &str); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr ); + ok(!str, "Unexpected name %p.\n", str); IXMLDOMNode_Release(node); /* NODE_ELEMENT */ @@ -14927,6 +14926,14 @@ static void test_comment(void) hr = CoCreateInstance(&CLSID_DOMDocument2, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void **)&doc); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocument_createComment(doc, _bstr_("comment"), &comment); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr ); + str = (void *)0xdeadbeef; + hr = IXMLDOMComment_get_baseName(comment, &str); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(!str, "Unexpected pointer %p.\n", str); + IXMLDOMComment_Release(comment); + for (int i = 0; i < 2; ++i) { hr = IXMLDOMDocument_put_preserveWhiteSpace(doc, i == 0 ? VARIANT_TRUE : VARIANT_FALSE); @@ -15514,6 +15521,10 @@ static void test_doc_fragment(void) ok(!lstrcmpW(str, L"#document-fragment"), "Unexpected name %s\n", debugstr_w(str)); SysFreeString(str); + hr = IXMLDOMDocumentFragment_get_baseName(fragment, &str); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(!str, "Unexpected name %p.\n", str); + /* Siblings */ hr = IXMLDOMDocumentFragment_get_nextSibling(fragment, NULL); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); @@ -15677,6 +15688,16 @@ static void test_text(void) hr = CoCreateInstance(&CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void **)&doc); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + V_VT(&var) = VT_I4; + V_I4(&var) = NODE_TEXT; + hr = IXMLDOMDocument_createNode(doc, var, _bstr_("text"), NULL, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + str = (void *)0x1; + hr = IXMLDOMNode_get_baseName(node, &str); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(!str, "Unexpected name %p.\n", str); + IXMLDOMNode_Release(node); + str = SysAllocString( L"open" ); hr = IXMLDOMDocument_createTextNode(doc, str, NULL); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); @@ -16421,11 +16442,22 @@ static void test_cdata(void) IXMLDOMDocument *doc; IXMLDOMNode *node; HRESULT hr; + VARIANT v; LONG len; BSTR str; doc = create_document(&IID_IXMLDOMDocument); + V_VT(&v) = VT_I4; + V_I4(&v) = NODE_CDATA_SECTION; + hr = IXMLDOMDocument_createNode(doc, v, _bstr_("cdata"), NULL, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + str = (void *)0x1; + hr = IXMLDOMNode_get_baseName(node, &str); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(!str, "Unexpected name %p.\n", str); + IXMLDOMNode_Release(node); + str = SysAllocString(L"[1]*2=3; &gee that is not right!"); hr = IXMLDOMDocument_createCDATASection(doc, str, NULL); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr ); @@ -16441,6 +16473,11 @@ static void test_cdata(void) ok(!lstrcmpW(str, L"#cdata-section"), "Unexpected named %s.\n", debugstr_w(str)); SysFreeString(str); + str = (void *)0x1; + hr = IXMLDOMCDATASection_get_baseName(cdata, &str); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(!str, "Unexpected name %p.\n", str); + hr = IXMLDOMCDATASection_get_xml(cdata, &str); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(!lstrcmpW( str, L"<![CDATA[[1]*2=3; &gee that is not right!]]>"), "Unexpected xml %s.\n", debugstr_w(str)); @@ -17308,6 +17345,15 @@ static void test_doctype(void) hr = IXMLDOMDocument_get_doctype(doc, &doctype); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMDocumentType_get_baseName(doctype, &str); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); +if (hr == S_OK) +{ + ok(!wcscmp(str, L"email"), "Unexpected name %s.\n", debugstr_w(str)); + SysFreeString(str); +} + hr = IXMLDOMDocumentType_get_previousSibling(doctype, &node); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMNode_get_nodeType(node, &node_type); @@ -17363,6 +17409,32 @@ if (hr == S_OK) IXMLDOMDocument_Release(doc); } +static void test_entityref(void) +{ + IXMLDOMEntityReference *ref; + IXMLDOMDocument *doc; + HRESULT hr; + BSTR str; + + doc = create_document(&IID_IXMLDOMDocument); + + hr = IXMLDOMDocument_createEntityReference(doc, _bstr_("ent"), &ref); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMEntityReference_get_baseName(ref, &str); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); +if (hr == S_OK) +{ + ok(!wcscmp(str, L"ent"), "Unexpected name %s.\n", debugstr_w(str)); + SysFreeString(str); +} + + IXMLDOMEntityReference_Release(ref); + + IXMLDOMDocument_Release(doc); +} + START_TEST(domdoc) { HRESULT hr; @@ -17472,6 +17544,7 @@ START_TEST(domdoc) test_interfaces(); test_dtd_validation(); test_doctype(); + test_entityref(); if (is_clsid_supported(&CLSID_MXNamespaceManager40, &IID_IMXNamespaceManager)) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10740
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/cdata.c | 2 +- dlls/msxml3/docfrag.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index 15b493fd1d5..d95ac03646a 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -425,7 +425,7 @@ static HRESULT WINAPI domcdata_get_prefix(IXMLDOMCDATASection *iface, BSTR *pref static HRESULT WINAPI domcdata_get_baseName(IXMLDOMCDATASection *iface, BSTR *name) { - FIXME("%p, %p: needs test\n", iface, name); + TRACE("%p, %p.\n", iface, name); return return_null_bstr(name); } diff --git a/dlls/msxml3/docfrag.c b/dlls/msxml3/docfrag.c index 6f3e55704b2..2f449270371 100644 --- a/dlls/msxml3/docfrag.c +++ b/dlls/msxml3/docfrag.c @@ -430,7 +430,7 @@ static HRESULT WINAPI docfrag_get_prefix(IXMLDOMDocumentFragment *iface, BSTR *p static HRESULT WINAPI docfrag_get_baseName(IXMLDOMDocumentFragment *iface, BSTR *name) { - FIXME("%p, %p: needs test\n", iface, name); + TRACE("%p, %p.\n", iface, name); return return_null_bstr(name); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10740
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index b3867464c67..8e96fbbedaf 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -17413,11 +17413,37 @@ static void test_entityref(void) { IXMLDOMEntityReference *ref; IXMLDOMDocument *doc; + IXMLDOMNode *node; HRESULT hr; + VARIANT v; BSTR str; doc = create_document(&IID_IXMLDOMDocument); + V_VT(&v) = VT_I1; + V_I1(&v) = NODE_ENTITY_REFERENCE; + hr = IXMLDOMDocument_createNode(doc, v, _bstr_("p:name"), NULL, &node); + todo_wine + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) IXMLDOMNode_Release(node); + hr = IXMLDOMDocument_createNode(doc, v, _bstr_("p:name"), _bstr_("uri"), &node); + todo_wine + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) IXMLDOMNode_Release(node); + hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), _bstr_("uri"), &node); + todo_wine + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) IXMLDOMNode_Release(node); + hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), _bstr_(""), &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IXMLDOMNode_Release(node); + + hr = IXMLDOMDocument_createEntityReference(doc, _bstr_("p:ent"), &ref); + todo_wine + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + IXMLDOMEntityReference_Release(ref); + hr = IXMLDOMDocument_createEntityReference(doc, _bstr_("ent"), &ref); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -17433,6 +17459,7 @@ if (hr == S_OK) IXMLDOMEntityReference_Release(ref); IXMLDOMDocument_Release(doc); + free_bstrs(); } START_TEST(domdoc) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10740
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/domdoc.c | 9 ++++++++- dlls/msxml3/tests/domdoc.c | 9 --------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 41e2f0eec32..8602b78e917 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -1162,7 +1162,6 @@ static HRESULT WINAPI domdoc_createNode(IXMLDOMDocument3 *iface, VARIANT type, B /* Check if we need a name */ case NODE_ELEMENT: case NODE_ATTRIBUTE: - case NODE_ENTITY_REFERENCE: case NODE_PROCESSING_INSTRUCTION: if (!name || *name == 0) @@ -1180,6 +1179,14 @@ static HRESULT WINAPI domdoc_createNode(IXMLDOMDocument3 *iface, VARIANT type, B break; } + if (node_type == NODE_ENTITY_REFERENCE) + { + if (!name || !parser_is_valid_qualified_name(name) || wcschr(name, ':')) + return E_FAIL; + if (uri && *uri) + return E_FAIL; + } + *node = NULL; if (FAILED(hr = domnode_create(node_type, name, name ? wcslen(name) : 0, diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 8e96fbbedaf..8e8123c6226 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -17423,26 +17423,17 @@ static void test_entityref(void) V_VT(&v) = VT_I1; V_I1(&v) = NODE_ENTITY_REFERENCE; hr = IXMLDOMDocument_createNode(doc, v, _bstr_("p:name"), NULL, &node); - todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) IXMLDOMNode_Release(node); hr = IXMLDOMDocument_createNode(doc, v, _bstr_("p:name"), _bstr_("uri"), &node); - todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) IXMLDOMNode_Release(node); hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), _bstr_("uri"), &node); - todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) IXMLDOMNode_Release(node); hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), _bstr_(""), &node); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); IXMLDOMNode_Release(node); hr = IXMLDOMDocument_createEntityReference(doc, _bstr_("p:ent"), &ref); - todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - IXMLDOMEntityReference_Release(ref); hr = IXMLDOMDocument_createEntityReference(doc, _bstr_("ent"), &ref); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10740
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 8e8123c6226..a6341ddff7e 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -15491,11 +15491,33 @@ static void test_doc_fragment(void) IXMLDOMNode *node; IXMLDOMText *text; HRESULT hr; + VARIANT v; BSTR str; hr = CoCreateInstance(&CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void **)&doc); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + V_VT(&v) = VT_I1; + V_I4(&v) = NODE_DOCUMENT_FRAGMENT; + hr = IXMLDOMDocument_createNode(doc, v, _bstr_("p:text"), _bstr_("uri"), &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + str = (void *)0x1; + hr = IXMLDOMNode_get_namespaceURI(node, &str); + todo_wine + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!str, "Unexpected string %p.\n", str); + if (hr == S_OK) SysFreeString(str); + str = (void *)0x1; + hr = IXMLDOMNode_get_baseName(node, &str); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(!str, "Unexpected string %p.\n", str); + str = (void *)0x1; + hr = IXMLDOMNode_get_prefix(node, &str); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(!str, "Unexpected string %p.\n", str); + IXMLDOMNode_Release(node); + hr = IXMLDOMDocument_createElement(doc, _bstr_("e"), &element); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10740
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/docfrag.c | 4 +--- dlls/msxml3/domdoc.c | 4 ++++ dlls/msxml3/tests/domdoc.c | 3 --- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/dlls/msxml3/docfrag.c b/dlls/msxml3/docfrag.c index 2f449270371..f3c99139f7b 100644 --- a/dlls/msxml3/docfrag.c +++ b/dlls/msxml3/docfrag.c @@ -414,11 +414,9 @@ static HRESULT WINAPI docfrag_get_parsed(IXMLDOMDocumentFragment *iface, VARIANT static HRESULT WINAPI docfrag_get_namespaceURI(IXMLDOMDocumentFragment *iface, BSTR *p) { - docfrag *docfrag = impl_from_IXMLDOMDocumentFragment(iface); - TRACE("%p, %p.\n", iface, p); - return node_get_namespaceURI(docfrag->node, p); + return return_null_bstr(p); } static HRESULT WINAPI docfrag_get_prefix(IXMLDOMDocumentFragment *iface, BSTR *prefix) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 8602b78e917..70488d26e10 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -1186,6 +1186,10 @@ static HRESULT WINAPI domdoc_createNode(IXMLDOMDocument3 *iface, VARIANT type, B if (uri && *uri) return E_FAIL; } + else if (node_type == NODE_DOCUMENT_FRAGMENT) + { + name = uri = NULL; + } *node = NULL; diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index a6341ddff7e..5cec139b9fe 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -15503,11 +15503,8 @@ static void test_doc_fragment(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); str = (void *)0x1; hr = IXMLDOMNode_get_namespaceURI(node, &str); - todo_wine ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!str, "Unexpected string %p.\n", str); - if (hr == S_OK) SysFreeString(str); str = (void *)0x1; hr = IXMLDOMNode_get_baseName(node, &str); ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10740
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)