Module: wine Branch: master Commit: 68aeee4d79ea88b0d36cd76aa301d83516b8421b URL: http://source.winehq.org/git/wine.git/?a=commit;h=68aeee4d79ea88b0d36cd76aa3...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Mar 20 14:01:00 2017 +0100
xmllite: Return WC_E_SYNTAX if there is unexpected data in the end of the stream.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/xmllite/reader.c | 13 ++++++++----- dlls/xmllite/tests/reader.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c index b28a4b1..7c9f76a 100644 --- a/dlls/xmllite/reader.c +++ b/dlls/xmllite/reader.c @@ -2610,14 +2610,17 @@ static HRESULT reader_parse_nextnode(xmlreader *reader) return reader_parse_content(reader); case XmlReadInState_MiscEnd: hr = reader_parse_misc(reader); - if (FAILED(hr)) return hr; + if (hr != S_FALSE) return hr;
- if (hr == S_FALSE) + if (*reader_get_ptr(reader)) { - reader->instate = XmlReadInState_Eof; - reader->state = XmlReadState_EndOfFile; - reader->nodetype = XmlNodeType_None; + WARN("found garbage in the end of XML\n"); + return WC_E_SYNTAX; } + + reader->instate = XmlReadInState_Eof; + reader->state = XmlReadState_EndOfFile; + reader->nodetype = XmlNodeType_None; return hr; case XmlReadInState_Eof: return S_FALSE; diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c index b2fa65b..c710894 100644 --- a/dlls/xmllite/tests/reader.c +++ b/dlls/xmllite/tests/reader.c @@ -2354,6 +2354,7 @@ static void test_eof_state(IXmlReader *reader, BOOL eof) static void test_endoffile(void) { static const char *xml = "<a/>"; + static const char *xml_garbageend = "<a/>text"; IXmlReader *reader; XmlNodeType type; IStream *stream; @@ -2393,6 +2394,33 @@ static void test_endoffile(void) IStream_Release(stream);
IXmlReader_Release(reader); + + hr = CreateXmlReader(&IID_IXmlReader, (void **)&reader, NULL); + ok(hr == S_OK, "S_OK, got %08x\n", hr); + + stream = create_stream_on_data(xml_garbageend, strlen(xml_garbageend)); + hr = IXmlReader_SetInput(reader, (IUnknown *)stream); + ok(hr == S_OK, "got %08x\n", hr); + IStream_Release(stream); + + type = XmlNodeType_None; + hr = IXmlReader_Read(reader, &type); + ok(hr == S_OK, "got %#x\n", hr); + ok(type == XmlNodeType_Element, "Unexpected type %d\n", type); + + test_eof_state(reader, FALSE); + + type = XmlNodeType_Element; + hr = IXmlReader_Read(reader, &type); + ok(hr == WC_E_SYNTAX, "got %#x\n", hr); + ok(type == XmlNodeType_None, "Unexpected type %d\n", type); + + test_eof_state(reader, FALSE); + + hr = IXmlReader_SetInput(reader, NULL); + ok(hr == S_OK, "got %08x\n", hr); + + IXmlReader_Release(reader); }
static void test_max_element_depth(void)