[PATCH 0/5] MR9059: xmllite/writer: Improve error handling in WriteChars().
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9059
From: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/xmllite/writer.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c index fa6665d15f5..300045a39ae 100644 --- a/dlls/xmllite/writer.c +++ b/dlls/xmllite/writer.c @@ -1251,6 +1251,7 @@ static HRESULT write_escaped_string(xmlwriter *writer, const WCHAR *string, unsi static HRESULT WINAPI xmlwriter_WriteChars(IXmlWriter *iface, const WCHAR *characters, UINT length) { xmlwriter *writer = impl_from_IXmlWriter(iface); + HRESULT hr = S_OK; TRACE("%p, %s, %d.\n", iface, debugstr_wn(characters, length), length); @@ -1267,7 +1268,7 @@ static HRESULT WINAPI xmlwriter_WriteChars(IXmlWriter *iface, const WCHAR *chara case XmlWriterState_InvalidEncoding: return MX_E_ENCODING; case XmlWriterState_ElemStarted: - writer_close_starttag(writer); + hr = writer_close_starttag(writer); break; case XmlWriterState_Ready: case XmlWriterState_DocClosed: @@ -1277,8 +1278,13 @@ static HRESULT WINAPI xmlwriter_WriteChars(IXmlWriter *iface, const WCHAR *chara ; } - writer->textnode = 1; - return write_escaped_string(writer, characters, length); + if (SUCCEEDED(hr)) + { + writer->textnode = 1; + hr = write_escaped_string(writer, characters, length); + } + + return hr; } static HRESULT WINAPI xmlwriter_WriteComment(IXmlWriter *iface, LPCWSTR comment) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9059
From: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/xmllite/writer.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c index 300045a39ae..a92ba881ae4 100644 --- a/dlls/xmllite/writer.c +++ b/dlls/xmllite/writer.c @@ -2064,23 +2064,24 @@ static HRESULT WINAPI xmlwriter_WriteStartElement(IXmlWriter *iface, LPCWSTR pre static HRESULT WINAPI xmlwriter_WriteString(IXmlWriter *iface, const WCHAR *string) { - xmlwriter *This = impl_from_IXmlWriter(iface); + xmlwriter *writer = impl_from_IXmlWriter(iface); + HRESULT hr = S_OK; - TRACE("%p %s\n", This, debugstr_w(string)); + TRACE("%p, %s.\n", iface, debugstr_w(string)); if (!string) return S_OK; - switch (This->state) + switch (writer->state) { case XmlWriterState_Initial: return E_UNEXPECTED; case XmlWriterState_ElemStarted: - writer_close_starttag(This); + hr = writer_close_starttag(writer); break; case XmlWriterState_Ready: case XmlWriterState_DocClosed: - This->state = XmlWriterState_DocClosed; + writer->state = XmlWriterState_DocClosed; return WR_E_INVALIDACTION; case XmlWriterState_InvalidEncoding: return MX_E_ENCODING; @@ -2088,8 +2089,13 @@ static HRESULT WINAPI xmlwriter_WriteString(IXmlWriter *iface, const WCHAR *stri ; } - This->textnode = 1; - return write_escaped_string(This, string, ~0u); + if (SUCCEEDED(hr)) + { + writer->textnode = 1; + hr = write_escaped_string(writer, string, ~0u); + } + + return hr; } static HRESULT WINAPI xmlwriter_WriteSurrogateCharEntity(IXmlWriter *iface, WCHAR wchLow, WCHAR wchHigh) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9059
From: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/xmllite/writer.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c index a92ba881ae4..894d396d183 100644 --- a/dlls/xmllite/writer.c +++ b/dlls/xmllite/writer.c @@ -1592,52 +1592,52 @@ static HRESULT WINAPI xmlwriter_WriteEntityRef(IXmlWriter *iface, LPCWSTR pwszNa static HRESULT WINAPI xmlwriter_WriteFullEndElement(IXmlWriter *iface) { - xmlwriter *This = impl_from_IXmlWriter(iface); + xmlwriter *writer = impl_from_IXmlWriter(iface); struct element *element; HRESULT hr = S_OK; - TRACE("%p\n", This); + TRACE("%p.\n", iface); - switch (This->state) + switch (writer->state) { case XmlWriterState_Initial: return E_UNEXPECTED; case XmlWriterState_Ready: case XmlWriterState_DocClosed: - This->state = XmlWriterState_DocClosed; + writer->state = XmlWriterState_DocClosed; return WR_E_INVALIDACTION; case XmlWriterState_InvalidEncoding: return MX_E_ENCODING; case XmlWriterState_ElemStarted: - writer_close_starttag(This); + if (FAILED(hr = writer_close_starttag(writer))) return hr; break; default: ; } - element = pop_element(This); + element = pop_element(writer); if (!element) return WR_E_INVALIDACTION; - writer_dec_indent(This); + writer_dec_indent(writer); /* don't force full end tag to the next line */ - if (This->state == XmlWriterState_ElemStarted) + if (writer->state == XmlWriterState_ElemStarted) { - This->state = XmlWriterState_Content; - This->textnode = 0; + writer->state = XmlWriterState_Content; + writer->textnode = 0; } else - write_node_indent(This, &hr); + write_node_indent(writer, &hr); /* write full end tag */ - write_output_buffer(This->output, L"</", 2); - write_output_buffer(This->output, element->qname, element->len); - write_output_buffer_char(This->output, '>'); + write_output(writer, L"</", 2, &hr); + write_output(writer, element->qname, element->len, &hr); + write_output(writer, L">", 1, &hr); - writer_free_element(This, element); + writer_free_element(writer, element); - return S_OK; + return hr; } static HRESULT WINAPI xmlwriter_WriteName(IXmlWriter *iface, LPCWSTR pwszName) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9059
From: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/xmllite/writer.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c index 894d396d183..96016807a17 100644 --- a/dlls/xmllite/writer.c +++ b/dlls/xmllite/writer.c @@ -1402,22 +1402,22 @@ static HRESULT WINAPI xmlwriter_WriteDocType(IXmlWriter *iface, LPCWSTR name, LP static HRESULT WINAPI xmlwriter_WriteElementString(IXmlWriter *iface, LPCWSTR prefix, LPCWSTR local_name, LPCWSTR uri, LPCWSTR value) { - xmlwriter *This = impl_from_IXmlWriter(iface); + xmlwriter *writer = impl_from_IXmlWriter(iface); int prefix_len, local_len; struct ns *ns; HRESULT hr; - TRACE("(%p)->(%s %s %s %s)\n", This, wine_dbgstr_w(prefix), wine_dbgstr_w(local_name), + TRACE("%p, %s, %s, %s, %s.\n", iface, wine_dbgstr_w(prefix), wine_dbgstr_w(local_name), wine_dbgstr_w(uri), wine_dbgstr_w(value)); - switch (This->state) + switch (writer->state) { case XmlWriterState_Initial: return E_UNEXPECTED; case XmlWriterState_InvalidEncoding: return MX_E_ENCODING; case XmlWriterState_ElemStarted: - writer_close_starttag(This); + if (FAILED(hr = writer_close_starttag(writer))) return hr; break; case XmlWriterState_DocClosed: return WR_E_INVALIDACTION; @@ -1435,7 +1435,7 @@ static HRESULT WINAPI xmlwriter_WriteElementString(IXmlWriter *iface, LPCWSTR pr if (FAILED(hr = is_valid_ncname(local_name, &local_len))) return hr; - ns = writer_find_ns(This, prefix, uri); + ns = writer_find_ns(writer, prefix, uri); if (!ns && !is_empty_string(prefix) && is_empty_string(uri)) return WR_E_NSPREFIXWITHEMPTYNSURI; @@ -1448,36 +1448,36 @@ static HRESULT WINAPI xmlwriter_WriteElementString(IXmlWriter *iface, LPCWSTR pr return WR_E_XMLNSURIDECLARATION; } - write_encoding_bom(This, &hr); - write_node_indent(This, &hr); + write_encoding_bom(writer, &hr); + write_node_indent(writer, &hr); - write_output_buffer_char(This->output, '<'); + write_output(writer, L"<", 1, &hr); if (ns) - write_output_qname(This->output, ns->prefix, ns->prefix_len, local_name, local_len); + write_output_qname(writer->output, ns->prefix, ns->prefix_len, local_name, local_len); else - write_output_qname(This->output, prefix, prefix_len, local_name, local_len); + write_output_qname(writer->output, prefix, prefix_len, local_name, local_len); if (!ns && (prefix_len || !is_empty_string(uri))) { - write_output_qname(This->output, L" xmlns", 6, prefix, prefix_len); - write_output_buffer_char(This->output, '='); - write_output_buffer_quoted(This->output, uri, -1); + write_output_qname(writer->output, L" xmlns", 6, prefix, prefix_len); + write_output(writer, L"=", 1, &hr); + write_output_buffer_quoted(writer->output, uri, -1); } if (value) { - write_output_buffer_char(This->output, '>'); - write_output_buffer(This->output, value, -1); - write_output_buffer(This->output, L"</", 2); - write_output_qname(This->output, prefix, prefix_len, local_name, local_len); - write_output_buffer_char(This->output, '>'); + write_output(writer, L">", 1, &hr); + write_output(writer, value, -1, &hr); + write_output(writer, L"</", 2, &hr); + write_output_qname(writer->output, prefix, prefix_len, local_name, local_len); + write_output(writer, L">", 1, &hr); } else - write_output_buffer(This->output, L" />", 3); + write_output(writer, L" />", 3, &hr); - This->state = XmlWriterState_Content; + writer->state = XmlWriterState_Content; - return S_OK; + return hr; } static HRESULT write_end_element(xmlwriter *writer, const struct element *element) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9059
From: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/xmllite/writer.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c index 96016807a17..76b4afafbb5 100644 --- a/dlls/xmllite/writer.c +++ b/dlls/xmllite/writer.c @@ -1882,21 +1882,21 @@ static HRESULT WINAPI xmlwriter_WriteQualifiedName(IXmlWriter *iface, LPCWSTR pw static HRESULT WINAPI xmlwriter_WriteRaw(IXmlWriter *iface, LPCWSTR data) { - xmlwriter *This = impl_from_IXmlWriter(iface); + xmlwriter *writer = impl_from_IXmlWriter(iface); unsigned int count; HRESULT hr = S_OK; - TRACE("%p %s\n", This, debugstr_w(data)); + TRACE("%p, %s.\n", iface, debugstr_w(data)); if (!data) return S_OK; - switch (This->state) + switch (writer->state) { case XmlWriterState_Initial: return E_UNEXPECTED; case XmlWriterState_Ready: - write_xmldecl(This, XmlStandalone_Omit, &hr); + write_xmldecl(writer, XmlStandalone_Omit, &hr); /* fallthrough */ case XmlWriterState_DocStarted: case XmlWriterState_PIDocStarted: @@ -1904,17 +1904,17 @@ static HRESULT WINAPI xmlwriter_WriteRaw(IXmlWriter *iface, LPCWSTR data) case XmlWriterState_InvalidEncoding: return MX_E_ENCODING; case XmlWriterState_ElemStarted: - writer_close_starttag(This); + hr = writer_close_starttag(writer); break; default: - This->state = XmlWriterState_DocClosed; + writer->state = XmlWriterState_DocClosed; return WR_E_INVALIDACTION; } - while (*data) + while (SUCCEEDED(hr) && *data) { - if (FAILED(hr = writer_get_next_write_count(data, ~0u, &count))) return hr; - if (FAILED(hr = write_output_buffer(This->output, data, count))) return hr; + if (FAILED(hr = writer_get_next_write_count(data, ~0u, &count))) break; + if (FAILED(hr = write_output(writer, data, count, &hr))) break; data += count; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9059
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)