Michael Karcher : msxml3: Avoid duplicate encoding.

Alexandre Julliard julliard at winehq.org
Mon Dec 1 07:34:24 CST 2008


Module: wine
Branch: master
Commit: e55da04e77ddebb1bba378b9b9e6538f0e664b30
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e55da04e77ddebb1bba378b9b9e6538f0e664b30

Author: Michael Karcher <wine at mkarcher.dialup.fu-berlin.de>
Date:   Sat Nov 29 10:51:20 2008 +0100

msxml3: Avoid duplicate encoding.

The libxml documentation suggests to either use
xmlEncodedEntitiesReentrant or xmlEncodeSpecialChars, but if you apply
both, you end up producing "&amp;amp;".

---

 dlls/msxml3/node.c         |    8 +++-----
 dlls/msxml3/tests/domdoc.c |   19 +++++++++++++++++++
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 19cee8f..3d6f2f3 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -920,7 +920,7 @@ static HRESULT WINAPI xmlnode_put_text(
     BSTR text)
 {
     xmlnode *This = impl_from_IXMLDOMNode( iface );
-    xmlChar *str, *str2, *str3;
+    xmlChar *str, *str2;
 
     TRACE("%p\n", This);
 
@@ -937,11 +937,9 @@ static HRESULT WINAPI xmlnode_put_text(
     /* Escape the string. */
     str2 = xmlEncodeEntitiesReentrant(This->node->doc, str);
     HeapFree(GetProcessHeap(), 0, str);
-    str3 = xmlEncodeSpecialChars(This->node->doc, str2);
-    xmlFree(str2);
 
-    xmlNodeSetContent(This->node, str3);
-    xmlFree(str3);
+    xmlNodeSetContent(This->node, str2);
+    xmlFree(str2);
 
     return S_OK;
 }
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index e27c506..4cff3cc 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -176,6 +176,8 @@ static WCHAR szElementXML[]  = {'<','E','l','e','T','e','s','t','/','>',0 };
 static WCHAR szElementXML2[] = {'<','E','l','e','T','e','s','t',' ','A','t','t','r','=','"','"','/','>',0 };
 static WCHAR szElementXML3[] = {'<','E','l','e','T','e','s','t',' ','A','t','t','r','=','"','"','>',
                                 'T','e','s','t','i','n','g','N','o','d','e','<','/','E','l','e','T','e','s','t','>',0 };
+static WCHAR szElementXML4[] = {'<','E','l','e','T','e','s','t',' ','A','t','t','r','=','"','"','>',
+                                '&','a','m','p',';','x',' ',0x2103,'<','/','E','l','e','T','e','s','t','>',0 };
 
 static WCHAR szAttribute[] = {'A','t','t','r',0 };
 static WCHAR szAttributeXML[] = {'A','t','t','r','=','"','"',0 };
@@ -190,6 +192,7 @@ static WCHAR szDocFragmentText[] = {'#','d','o','c','u','m','e','n','t','-','f',
 
 static WCHAR szEntityRef[] = {'e','n','t','i','t','y','r','e','f',0 };
 static WCHAR szEntityRefXML[] = {'&','e','n','t','i','t','y','r','e','f',';',0 };
+static WCHAR szStrangeChars[] = {'&','x',' ',0x2103, 0};
 
 #define expect_bstr_eq_and_free(bstr, expect) { \
     BSTR bstrExp = alloc_str_from_narrow(expect); \
@@ -2893,6 +2896,22 @@ static void test_xmlTypes(void)
                 ok( !lstrcmpW( str, szElementXML3 ), "incorrect element xml\n");
                 SysFreeString(str);
 
+                /* Test for reversible escaping */
+                str = SysAllocString( szStrangeChars );
+                hr = IXMLDOMElement_put_text(pElement, str);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                SysFreeString( str );
+
+                hr = IXMLDOMElement_get_xml(pElement, &str);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok( !lstrcmpW( str, szElementXML4 ), "incorrect element xml\n");
+                SysFreeString(str);
+
+                hr = IXMLDOMElement_get_text(pElement, &str);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok( !lstrcmpW( str, szStrangeChars ), "incorrect element text\n");
+                SysFreeString(str);
+
                 IXMLDOMElement_Release(pElement);
             }
 




More information about the wine-cvs mailing list