From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/saxreader.c | 34 ++++++++++++++++++++++++++++++---- dlls/msxml3/tests/saxreader.c | 11 ----------- dlls/msxml6/tests/saxreader.c | 11 ----------- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 4b0ec0085d7..9da59602be2 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -209,6 +209,8 @@ enum error_codes E_SAX_BADXMLCASE = 0xc00ce576, E_SAX_INVALID_STANDALONE = 0xc00ce579, E_SAX_INVALID_VERSION = 0xc00ce57f, + + E_SAX_MAX_ELEMENT_DEPTH = 0xc00cee92, }; enum attdef_type @@ -465,6 +467,7 @@ struct saxreader BSTR xmldecl_standalone; BSTR xmldecl_encoding; int max_xml_size; + int max_element_depth; BSTR empty_bstr; MSXML_VERSION version; }; @@ -866,6 +869,7 @@ struct saxlocator bool vbInterface; struct list elements; enum saxreader_state state; + int depth; ISequentialStream *stream; bool eos; @@ -2358,19 +2362,25 @@ static void saxlocator_start_element(struct saxlocator *locator, const struct te struct element *element) { struct saxcontenthandler_iface *handler = saxreader_get_contenthandler(locator->saxreader); + int max_depth = locator->saxreader->max_element_depth; + MSXML_VERSION version = locator->saxreader->version; BSTR uri = NULL, local = NULL; HRESULT hr; if (locator->status != S_OK) return; + ++locator->depth; + if (max_depth && locator->depth > max_depth) + return saxreader_set_error(locator, version < MSXML6 ? E_ABORT : E_SAX_MAX_ELEMENT_DEPTH); + if (!saxreader_has_handler(locator, SAXContentHandler)) return; locator->line = position->line; locator->column = position->column; /* Point to the closing '>' */ - if (locator->saxreader->version >= MSXML4) + if (version >= MSXML4) --locator->column; if (is_namespaces_enabled(locator->saxreader)) @@ -2426,6 +2436,7 @@ static void saxlocator_end_element(struct saxlocator *locator, const struct text if (locator->status != S_OK) return; + --locator->depth; locator->line = position->line; /* Point to the closing '>' */ if (locator->saxreader->version >= MSXML4) @@ -5820,9 +5831,16 @@ static HRESULT saxreader_put_property(struct saxreader *reader, const WCHAR *pro if (!wcscmp(prop, L"max-element-depth")) { - if (V_VT(v) == VT_I4 && V_I4(v) == 0) return S_OK; - FIXME("(%p)->(%s): max-element-depth unsupported\n", reader, debugstr_variant(v)); - return E_NOTIMPL; + int depth; + + if (FAILED(saxreader_get_int_property(&value, &depth))) + return E_FAIL; + + if (depth < 0) + return E_INVALIDARG; + + reader->max_element_depth = depth; + return S_OK; } FIXME("(%p)->(%s:%s): unsupported property\n", reader, debugstr_w(prop), debugstr_variant(v)); @@ -5894,6 +5912,13 @@ static HRESULT saxreader_get_property(const struct saxreader *reader, const WCHA return S_OK; } + if (!wcscmp(prop, L"max-element-depth")) + { + V_VT(value) = VT_I4; + V_I4(value) = reader->max_element_depth; + return S_OK; + } + FIXME("(%p)->(%s) unsupported property\n", reader, debugstr_w(prop)); return E_NOTIMPL; @@ -6418,6 +6443,7 @@ static HRESULT saxreader_create(MSXML_VERSION version, struct saxreader **reader object->features = Namespaces | NamespacePrefixes | NormalizeLineBreaks; object->version = version; object->empty_bstr = SysAllocString(L""); + object->max_element_depth = version > MSXML3 ? 256 : 5000; init_dispex(&object->dispex, (IUnknown *)&object->IVBSAXXMLReader_iface, &saxreader_dispex); diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 67cbe9c53ff..9ec329221e8 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -6470,43 +6470,33 @@ static void test_saxreader_max_element_depth(void) memset(&v, 0, sizeof(v)); hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_I4, "Unexpected type %d.\n", V_VT(&v)); - todo_wine ok(V_I4(&v) == 5000, "Unexpected value %ld.\n", V_I4(&v)); V_UI4(&v) = 2147483648; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); V_I4(&v) = 2147483647; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_I4, "Unexpected type %d.\n", V_VT(&v)); ok(V_I4(&v) == 2147483647, "Unexpected value %ld.\n", V_I4(&v)); V_I4(&v) = 0; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_I4(&v) == 0, "Unexpected value %ld.\n", V_I4(&v)); V_I4(&v) = 1; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&v) = VT_BSTR; @@ -6524,7 +6514,6 @@ static void test_saxreader_max_element_depth(void) V_VT(&v) = VT_BSTR; V_BSTR(&v) = SysAllocString(L"<a>text<!-- comment --><b/></a>"); hr = ISAXXMLReader_parse(reader, v); - todo_wine ok(hr == E_ABORT, "Unexpected hr %#lx.\n", hr); VariantClear(&v); diff --git a/dlls/msxml6/tests/saxreader.c b/dlls/msxml6/tests/saxreader.c index 0868344a34b..9c5676bc3ce 100644 --- a/dlls/msxml6/tests/saxreader.c +++ b/dlls/msxml6/tests/saxreader.c @@ -5326,43 +5326,33 @@ static void test_saxreader_max_element_depth(void) memset(&v, 0, sizeof(v)); hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_I4, "Unexpected type %d.\n", V_VT(&v)); - todo_wine ok(V_I4(&v) == 256, "Unexpected value %ld.\n", V_I4(&v)); V_UI4(&v) = 2147483648; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); V_I4(&v) = 2147483647; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(V_VT(&v) == VT_I4, "Unexpected type %d.\n", V_VT(&v)); ok(V_I4(&v) == 2147483647, "Unexpected value %ld.\n", V_I4(&v)); V_I4(&v) = 0; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ISAXXMLReader_getProperty(reader, _bstr_("max-element-depth"), &v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_I4(&v) == 0, "Unexpected value %ld.\n", V_I4(&v)); V_I4(&v) = 1; hr = ISAXXMLReader_putProperty(reader, _bstr_("max-element-depth"), v); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); V_VT(&v) = VT_BSTR; @@ -5380,7 +5370,6 @@ static void test_saxreader_max_element_depth(void) V_VT(&v) = VT_BSTR; V_BSTR(&v) = SysAllocString(L"<a>text<!-- comment --><b/></a>"); hr = ISAXXMLReader_parse(reader, v); - todo_wine ok(hr == 0xc00cee92, "Unexpected hr %#lx.\n", hr); VariantClear(&v); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10706