[PATCH] Treat input BSTR as general WCHAR string for ::loadXML()

Nikolay Sivov nsivov at codeweavers.com
Sun Mar 14 18:16:02 CDT 2010


---
 dlls/msxml3/domdoc.c       |    7 ++++---
 dlls/msxml3/tests/domdoc.c |   16 ++++++++++++++++
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index a29e9b2..aae8a34 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1650,19 +1650,20 @@ static HRESULT WINAPI domdoc_abort(
 
 static BOOL bstr_to_utf8( BSTR bstr, char **pstr, int *plen )
 {
-    UINT len, blen = SysStringLen( bstr );
+    UINT len;
     LPSTR str;
 
-    len = WideCharToMultiByte( CP_UTF8, 0, bstr, blen, NULL, 0, NULL, NULL );
+    len = WideCharToMultiByte( CP_UTF8, 0, bstr, -1, NULL, 0, NULL, NULL );
     str = heap_alloc( len );
     if ( !str )
         return FALSE;
-    WideCharToMultiByte( CP_UTF8, 0, bstr, blen, str, len, NULL, NULL );
+    WideCharToMultiByte( CP_UTF8, 0, bstr, -1, str, len, NULL, NULL );
     *plen = len;
     *pstr = str;
     return TRUE;
 }
 
+/* don't rely on data to be in BSTR format, treat it as WCHAR string */
 static HRESULT WINAPI domdoc_loadXML(
     IXMLDOMDocument2 *iface,
     BSTR bstrXML,
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 5f06d93..08b5776 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -535,6 +535,7 @@ static void test_domdoc( void )
     BSTR str;
     LONG code;
     LONG nLength = 0;
+    WCHAR buff[100];
 
     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
@@ -543,6 +544,12 @@ static void test_domdoc( void )
 
     test_disp((IUnknown*)doc);
 
+if (0)
+{
+    /* crashes on native */
+    r = IXMLDOMDocument_loadXML( doc, (BSTR)0x1, NULL );
+}
+
     /* try some stupid things */
     r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
     ok( r == S_FALSE, "loadXML failed\n");
@@ -601,6 +608,15 @@ static void test_domdoc( void )
     ok( r == S_FALSE, "should be no document element\n");
     ok( element == NULL, "Element should be NULL\n");
 
+    /* test for BSTR handling, pass broken BSTR */
+    memcpy(&buff[2], szComplete1, sizeof(szComplete1));
+    /* just a big length */
+    *(DWORD*)buff = 0xf0f0;
+    b = VARIANT_FALSE;
+    r = IXMLDOMDocument_loadXML( doc, &buff[2], &b );
+    ok( r == S_OK, "loadXML failed\n");
+    ok( b == VARIANT_TRUE, "failed to load XML string\n");
+
     /* try to load something valid */
     b = VARIANT_FALSE;
     str = SysAllocString( szComplete1 );
-- 
1.5.6.5


--=-AW644PkXiK19/kr/ktB3--




More information about the wine-patches mailing list