[PATCH resend] msxml3: Remove CRs in domtext_put_data and add them in domtext_get_xml.

Nikolay Sivov bunglehead at gmail.com
Thu Aug 17 14:34:35 CDT 2017


On 03.08.2017 18:17, Alex Henrie wrote:
> Fixes https://bugs.winehq.org/show_bug.cgi?id=42468
> 
> To be clear, I am not trying to fix all whitespace processing issues. I
> am only trying to prevent "
" from being erroneously inserted into
> the output.
> 
> Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
> ---
>  dlls/msxml3/tests/domdoc.c | 106 +++++++++++++++++++++++++++++++++++++--------
>  dlls/msxml3/text.c         |  42 +++++++++++++++---
>  2 files changed, 122 insertions(+), 26 deletions(-)
> 
> diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c

I think it needs more tests, for xml:space and put_preserveWhiteSpace().

> diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
> index 3a12d4bf62..6814c1f817 100644
> --- a/dlls/msxml3/text.c
> +++ b/dlls/msxml3/text.c
> @@ -519,10 +519,15 @@ static HRESULT WINAPI domtext_get_xml(
>      BSTR* p)
>  {
>      domtext *This = impl_from_IXMLDOMText( iface );
> +    HRESULT hr;
>  
>      TRACE("(%p)->(%p)\n", This, p);
>  
> -    return node_get_xml(&This->node, FALSE, p);
> +    hr = node_get_xml(&This->node, FALSE, p);
> +    if (hr == S_OK)
> +        *p = EnsureCorrectEOL(*p);
> +
> +    return hr;

Will node_get_xml(..., TRUE, ...) work?

>  }
>  
>  static HRESULT WINAPI domtext_transformNode(
> @@ -616,15 +621,38 @@ static HRESULT WINAPI domtext_put_data(
>      BSTR data)
>  {
>      domtext *This = impl_from_IXMLDOMText( iface );
> -    static const WCHAR rnW[] = {'\r','\n',0};
> +    BSTR normalized_data = NULL;
> +    HRESULT hr;
> +    int i, j;
>  
>      TRACE("(%p)->(%s)\n", This, debugstr_w(data));
>  
> -    if (data && !strcmpW(rnW, data))
> -        This->node.node->name = xmlStringTextNoenc;
> -    else
> -        domtext_reset_noenc(This);
> -    return node_set_content(&This->node, data);
> +    if (data)
> +    {
> +        /* normalize line endings */
> +        normalized_data = SysAllocStringLen(NULL, SysStringLen(data));
> +        if (!normalized_data) return E_OUTOFMEMORY;
> +        for (i = 0, j = 0; data[i]; i++)
> +        {
> +            if (data[i] == '\r')
> +            {
> +                if (data[i + 1] == '\n')
> +                    continue; /* change \r\n to just \n */
> +                else
> +                    normalized_data[j] = '\n'; /* change \r by itself to \n */
> +            }
> +            else
> +                normalized_data[j] = data[i];
> +            j++;
> +        }
> +        normalized_data[j] = 0;

The only purpose for that is to inhibit libxml2 escaping, right? Could
this be done the way it is now, but with something more elaborate than
comparing to "\r\n"?

> +    }
> +
> +    domtext_reset_noenc(This);
> +    hr = node_set_content(&This->node, normalized_data);
> +
> +    SysFreeString(normalized_data);
> +    return hr;
>  }
>  
>  static HRESULT WINAPI domtext_get_length(
> 




More information about the wine-devel mailing list