[PATCH 1/2] xmllite/reader: Enter error state on parsing error
Nikolay Sivov
nsivov at codeweavers.com
Mon Mar 13 04:27:54 CDT 2017
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/xmllite/reader.c | 31 +++++++++++++++++++++++++------
dlls/xmllite/tests/reader.c | 23 +++++++++++++++--------
2 files changed, 40 insertions(+), 14 deletions(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index b5088e83d0..6379b70612 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -264,6 +264,7 @@ typedef struct
xmlreaderinput *input;
IMalloc *imalloc;
XmlReadState state;
+ HRESULT error; /* error set on XmlReadState_Error */
XmlReaderInternalState instate;
XmlReaderResumeState resumestate;
XmlNodeType nodetype;
@@ -2821,19 +2822,37 @@ static HRESULT WINAPI xmlreader_Read(IXmlReader* iface, XmlNodeType *nodetype)
{
xmlreader *This = impl_from_IXmlReader(iface);
XmlNodeType oldtype = This->nodetype;
+ XmlNodeType type;
HRESULT hr;
TRACE("(%p)->(%p)\n", This, nodetype);
- if (This->state == XmlReadState_Closed) return S_FALSE;
+ if (!nodetype)
+ nodetype = &type;
- hr = reader_parse_nextnode(This);
- if (oldtype == XmlNodeType_None && This->nodetype != oldtype)
- This->state = XmlReadState_Interactive;
+ switch (This->state)
+ {
+ case XmlReadState_Closed:
+ hr = S_FALSE;
+ break;
+ case XmlReadState_Error:
+ hr = This->error;
+ break;
+ default:
+ hr = reader_parse_nextnode(This);
+ if (SUCCEEDED(hr) && oldtype == XmlNodeType_None && This->nodetype != oldtype)
+ This->state = XmlReadState_Interactive;
+
+ if (FAILED(hr))
+ {
+ This->state = XmlReadState_Error;
+ This->nodetype = XmlNodeType_None;
+ This->error = hr;
+ }
+ }
TRACE("node type %s\n", debugstr_nodetype(This->nodetype));
- if (nodetype)
- *nodetype = This->nodetype;
+ *nodetype = This->nodetype;
return hr;
}
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index e66b9e4240..d225ab3fd8 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -1559,8 +1559,8 @@ static void test_read_element(void)
type = XmlNodeType_Element;
hr = IXmlReader_Read(reader, &type);
ok(hr == WC_E_ELEMENTMATCH, "got %08x\n", hr);
-todo_wine
ok(type == XmlNodeType_None, "got %d\n", type);
+ TEST_READER_STATE(reader, XmlReadState_Error);
IStream_Release(stream);
@@ -2369,6 +2369,7 @@ static void test_max_element_depth(void)
"</c>"
"</b>"
"</a>";
+ XmlNodeType nodetype;
unsigned int count;
IXmlReader *reader;
IStream *stream;
@@ -2401,20 +2402,19 @@ static void test_max_element_depth(void)
hr = IXmlReader_Read(reader, NULL);
ok(hr == SC_E_MAXELEMENTDEPTH, "got %08x\n", hr);
-todo_wine {
+todo_wine
TEST_DEPTH2(reader, 0, 2);
TEST_READER_STATE(reader, XmlReadState_Error);
-}
+
hr = IXmlReader_SetProperty(reader, XmlReaderProperty_MaxElementDepth, 10);
ok(hr == S_OK, "got %08x\n", hr);
hr = IXmlReader_Read(reader, NULL);
-todo_wine {
ok(hr == SC_E_MAXELEMENTDEPTH, "got %08x\n", hr);
+todo_wine
TEST_DEPTH2(reader, 0, 2);
TEST_READER_STATE(reader, XmlReadState_Error);
-}
IStream_Release(stream);
/* test if stepping into attributes enforces depth limit too */
@@ -2444,13 +2444,20 @@ todo_wine {
TEST_DEPTH(reader, 2);
TEST_READER_STATE(reader, XmlReadState_Interactive);
- hr = IXmlReader_Read(reader, NULL);
+ nodetype = 123;
+ hr = IXmlReader_Read(reader, &nodetype);
ok(hr == SC_E_MAXELEMENTDEPTH, "got %08x\n", hr);
+ ok(nodetype == XmlNodeType_None, "got node type %d\n", nodetype);
-todo_wine {
+ nodetype = 123;
+ hr = IXmlReader_Read(reader, &nodetype);
+ ok(hr == SC_E_MAXELEMENTDEPTH, "got %08x\n", hr);
+ ok(nodetype == XmlNodeType_None, "got node type %d\n", nodetype);
+
+todo_wine
TEST_DEPTH2(reader, 0, 2);
TEST_READER_STATE(reader, XmlReadState_Error);
-}
+
IStream_Release(stream);
/* set max depth to 0, this disables depth limit */
--
2.11.0
More information about the wine-patches
mailing list