Module: wine Branch: oldstable Commit: 98a3f0376bd0a7bf8e1248005bcb10917c1e62d1 URL: https://source.winehq.org/git/wine.git/?a=commit;h=98a3f0376bd0a7bf8e1248005...
Author: Jefferson Carpenter jeffersoncarpenter2@gmail.com Date: Fri Oct 22 09:56:54 2021 +0300
msxml3/saxreader: Handle null url in parseURL().
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51267 Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit b7386cec716013e8a17abae54f1609ba2e8518c0) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
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;