[PATCH 2/2] xmllite: Return syntax error on nul character in the stream.

Jeff Smith whydoubt at gmail.com
Wed Dec 4 12:52:53 CST 2019


Signed-off-by: Jeff Smith <whydoubt at gmail.com>
---
 dlls/xmllite/reader.c       | 11 +++++++++++
 dlls/xmllite/tests/reader.c |  4 ----
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index eddc4d8eec..c8083f63be 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -1696,6 +1696,14 @@ static HRESULT reader_parse_pi(xmlreader *reader)
     return S_OK;
 }
 
+/* Determine if we are encountering a nul character within the stream */
+static BOOL reader_at_nul(xmlreader *reader)
+{
+    encoded_buffer *buffer = &reader->input->buffer->utf16;
+    return (buffer->cur*sizeof(WCHAR) < buffer->written &&
+            *((WCHAR*)buffer->data + buffer->cur) == 0);
+}
+
 /* This one is used to parse significant whitespace nodes, like in Misc production */
 static HRESULT reader_parse_whitespace(xmlreader *reader)
 {
@@ -1716,6 +1724,7 @@ static HRESULT reader_parse_whitespace(xmlreader *reader)
         UINT start;
 
         reader_skipspaces(reader);
+        if (reader_at_nul(reader)) return WC_E_SYNTAX;
         if (is_reader_pending(reader)) return S_OK;
 
         start = reader->resume[XmlReadResume_Body];
@@ -1766,6 +1775,8 @@ static HRESULT reader_parse_misc(xmlreader *reader)
             hr = reader_parse_comment(reader);
         else if (!reader_cmp(reader, piW))
             hr = reader_parse_pi(reader);
+        else if (reader_at_nul(reader))
+            return WC_E_SYNTAX;
         else
             break;
 
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 88b9103e1e..7ad548d081 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -1051,7 +1051,6 @@ static void test_read_nul(void)
 
     type = -1;
     hr = IXmlReader_Read(reader, &type);
-todo_wine
     ok(hr == WC_E_SYNTAX || broken(hr == WC_E_XMLCHARACTER), "expected WC_E_SYNTAX, got 0x%08x\n", hr);
     ok(type == XmlNodeType_None, "expected XmlNodeType_None, got %s\n", type_to_str(type));
 
@@ -1064,10 +1063,8 @@ todo_wine
 
     type = -1;
     hr = IXmlReader_Read(reader, &type);
-todo_wine {
     ok(hr == WC_E_SYNTAX || broken(hr == WC_E_XMLCHARACTER), "expected WC_E_SYNTAX, got 0x%08x\n", hr);
     ok(type == XmlNodeType_None, "expected XmlNodeType_None, got %s\n", type_to_str(type));
-}
 
     stream = create_stream_on_data(xml_comment, sizeof(xml_comment));
     hr = IXmlReader_SetInput(reader, (IUnknown *)stream);
@@ -1079,7 +1076,6 @@ todo_wine {
 
     type = -1;
     hr = IXmlReader_Read(reader, &type);
-todo_wine
     ok(hr == WC_E_SYNTAX || broken(hr == WC_E_XMLCHARACTER), "expected WC_E_SYNTAX, got 0x%08x\n", hr);
     ok(type == XmlNodeType_None, "expected XmlNodeType_None, got %s\n", type_to_str(type));
 
-- 
2.23.0




More information about the wine-devel mailing list