Module: wine Branch: master Commit: 2060d80d24980b1c85ca144b2c43c2b5cbbc7ec3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2060d80d24980b1c85ca144b2c...
Author: Nikolay Sivov nsivov@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 );