Jacek Caban : xmllite: Return WC_E_SYNTAX if there is unexpected data in the end of the stream.

Alexandre Julliard julliard at winehq.org
Mon Mar 20 17:16:46 CDT 2017


Module: wine
Branch: master
Commit: 68aeee4d79ea88b0d36cd76aa301d83516b8421b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=68aeee4d79ea88b0d36cd76aa301d83516b8421b

Author: Jacek Caban <jacek at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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)




More information about the wine-cvs mailing list