Module: wine Branch: master Commit: 80e70a827172e37ac84ed279e580591fc09f68be URL: http://source.winehq.org/git/wine.git/?a=commit;h=80e70a827172e37ac84ed279e5... Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Tue Jun 18 16:31:01 2013 +0400 xmllite: Handle nesting depth limit better. --- dlls/xmllite/reader.c | 12 ++++++++++-- dlls/xmllite/tests/reader.c | 5 ++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c index e2f79a1..b556d7d 100644 --- a/dlls/xmllite/reader.c +++ b/dlls/xmllite/reader.c @@ -246,6 +246,7 @@ typedef struct struct list elements; strval strvalues[StringValue_Last]; UINT depth; + UINT max_depth; BOOL empty_element; WCHAR *resume[XmlReadResume_Last]; /* pointers used to resume reader */ } xmlreader; @@ -427,11 +428,15 @@ static void reader_clear_elements(xmlreader *reader) static HRESULT reader_inc_depth(xmlreader *reader) { - /* FIXME: handle XmlReaderProperty_MaxElementDepth property */ - reader->depth++; + if (++reader->depth > reader->max_depth) return SC_E_MAXELEMENTDEPTH; return S_OK; } +static void reader_dec_depth(xmlreader *reader) +{ + if (reader->depth > 1) reader->depth--; +} + static HRESULT reader_push_element(xmlreader *reader, strval *qname) { struct element *elem; @@ -469,6 +474,7 @@ static void reader_pop_element(xmlreader *reader) list_remove(&elem->entry); reader_free_strvalued(reader, &elem->qname); reader_free(reader, elem); + reader_dec_depth(reader); } } @@ -1137,6 +1143,7 @@ static HRESULT reader_parse_xmldecl(xmlreader *reader) if (reader_cmp(reader, declcloseW)) return WC_E_XMLDECL; reader_skipn(reader, 2); + reader_inc_depth(reader); reader->nodetype = XmlNodeType_XmlDeclaration; reader_set_strvalue(reader, StringValue_LocalName, &strval_empty); reader_set_strvalue(reader, StringValue_QualifiedName, &strval_empty); @@ -2659,6 +2666,7 @@ HRESULT WINAPI CreateXmlReader(REFIID riid, void **obj, IMalloc *imalloc) reader->attr = NULL; list_init(&reader->elements); reader->depth = 0; + reader->max_depth = 256; reader->empty_element = FALSE; memset(reader->resume, 0, sizeof(reader->resume)); diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c index 9be5125..86bdf69 100644 --- a/dlls/xmllite/tests/reader.c +++ b/dlls/xmllite/tests/reader.c @@ -742,7 +742,6 @@ static void test_read_xmldeclaration(void) hr = IXmlReader_GetDepth(reader, &count); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); -todo_wine ok(count == 1, "Expected 1, got %d\n", count); hr = IXmlReader_MoveToElement(reader); @@ -1166,16 +1165,20 @@ static void test_read_element(void) ok(hr == S_OK, "got %08x\n", hr); ok(depth == 0, "got %d\n", depth); + type = XmlNodeType_None; hr = IXmlReader_Read(reader, &type); ok(hr == S_OK, "got %08x\n", hr); + ok(type == XmlNodeType_Element, "got %d\n", type); depth = 1; hr = IXmlReader_GetDepth(reader, &depth); ok(hr == S_OK, "got %08x\n", hr); ok(depth == 0, "got %d\n", depth); + type = XmlNodeType_None; hr = IXmlReader_Read(reader, &type); ok(hr == S_OK, "got %08x\n", hr); + ok(type == XmlNodeType_Element, "got %d\n", type); depth = 0; hr = IXmlReader_GetDepth(reader, &depth);