Nikolay Sivov : msxml3: Treat input BSTR as general WCHAR string for :: loadXML().
Alexandre Julliard
julliard at winehq.org
Mon Mar 15 12:19:38 CDT 2010
Module: wine
Branch: master
Commit: 2060d80d24980b1c85ca144b2c43c2b5cbbc7ec3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2060d80d24980b1c85ca144b2c43c2b5cbbc7ec3
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Mar 15 02:16:02 2010 +0300
msxml3: Treat input BSTR as general WCHAR string for ::loadXML().
---
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 );
More information about the wine-cvs
mailing list