Signed-off-by: Jeff Smith whydoubt@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));