From 2060d80d24980b1c85ca144b2c43c2b5cbbc7ec3 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 15 Mar 2010 02:16:02 +0300 Subject: [PATCH] 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 a29e9b2fb3..aae8a34350 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 5f06d93f38..08b577631d 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 ); -- 2.33.8