From 98a3f0376bd0a7bf8e1248005bcb10917c1e62d1 Mon Sep 17 00:00:00 2001 From: Jefferson Carpenter Date: Fri, 22 Oct 2021 09:56:54 +0300 Subject: [PATCH] msxml3/saxreader: Handle null url in parseURL(). Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51267 Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard (cherry picked from commit b7386cec716013e8a17abae54f1609ba2e8518c0) Signed-off-by: Michael Stefaniuc --- dlls/msxml3/saxreader.c | 14 +++++++------- dlls/msxml3/tests/saxreader.c | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index fc27260cc2c..4d12ebbc5a6 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -2734,23 +2734,23 @@ static HRESULT internal_onDataAvailable(void *obj, char *ptr, DWORD len) return internal_parseBuffer(This, ptr, len, FALSE); } -static HRESULT internal_parseURL( - saxreader* This, - const WCHAR *url, - BOOL vbInterface) +static HRESULT internal_parseURL(saxreader *reader, const WCHAR *url, BOOL vbInterface) { IMoniker *mon; bsc_t *bsc; HRESULT hr; - TRACE("(%p)->(%s)\n", This, debugstr_w(url)); + TRACE("%p, %s.\n", reader, debugstr_w(url)); + + if (!url && reader->version < MSXML4) + return E_INVALIDARG; hr = create_moniker_from_url(url, &mon); if(FAILED(hr)) return hr; - if(vbInterface) hr = bind_url(mon, internal_vbonDataAvailable, This, &bsc); - else hr = bind_url(mon, internal_onDataAvailable, This, &bsc); + if(vbInterface) hr = bind_url(mon, internal_vbonDataAvailable, reader, &bsc); + else hr = bind_url(mon, internal_onDataAvailable, reader, &bsc); IMoniker_Release(mon); if(FAILED(hr)) diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index ab814c5f764..0b5e3085ad5 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -2310,6 +2310,22 @@ static void test_saxreader(void) WriteFile(file, testXML, sizeof(testXML)-1, &written, NULL); CloseHandle(file); + /* crashes on newer versions */ + if (IsEqualGUID(table->clsid, &CLSID_SAXXMLReader) || + IsEqualGUID(table->clsid, &CLSID_SAXXMLReader30)) + { + IVBSAXXMLReader *vb_reader; + + hr = ISAXXMLReader_parseURL(reader, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); + + hr = ISAXXMLReader_QueryInterface(reader, &IID_IVBSAXXMLReader, (void **)&vb_reader); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + hr = IVBSAXXMLReader_parseURL(vb_reader, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); + IVBSAXXMLReader_Release(vb_reader); + } + if (IsEqualGUID(table->clsid, &CLSID_SAXXMLReader40) || IsEqualGUID(table->clsid, &CLSID_SAXXMLReader60)) test_seq = content_handler_test1_alternate;