From: Edward O'Callaghan edward@antitrust.cc
The spec says if the passed pointer is NULL then return E_POINTER and not to just unconditionally deref then set NULL.
Signed-off-by: Edward O'Callaghan edward@antitrust.cc --- dlls/shell32/shelllink.c | 19 ++++++++++--------- dlls/shell32/tests/shelllink.c | 4 ++++ 2 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/dlls/shell32/shelllink.c b/dlls/shell32/shelllink.c index 30cd038728f..9e18546b6af 100644 --- a/dlls/shell32/shelllink.c +++ b/dlls/shell32/shelllink.c @@ -1558,7 +1558,8 @@ static HRESULT WINAPI IShellLinkW_fnQueryInterface(
TRACE("(%p)->(%s)\n", This, debugstr_guid(riid));
- *ppvObj = NULL; + if (!ppvObj) + return E_POINTER;
if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IShellLinkA)) { @@ -1595,16 +1596,16 @@ static HRESULT WINAPI IShellLinkW_fnQueryInterface( else if(IsEqualIID(riid, &IID_IPropertyStore)) { *ppvObj = &This->IPropertyStore_iface; + } else { + *ppvObj = NULL; + ERR("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; }
- if(*ppvObj) - { - IUnknown_AddRef((IUnknown*)*ppvObj); - TRACE("-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj); - return S_OK; - } - ERR("-- Interface: E_NOINTERFACE\n"); - return E_NOINTERFACE; + IUnknown_AddRef((IUnknown*)*ppvObj); + TRACE("-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj); + + return S_OK; }
/****************************************************************************** diff --git a/dlls/shell32/tests/shelllink.c b/dlls/shell32/tests/shelllink.c index f13155ade2f..2715733af93 100644 --- a/dlls/shell32/tests/shelllink.c +++ b/dlls/shell32/tests/shelllink.c @@ -887,6 +887,10 @@ static void test_datalink(void) r = IShellLinkW_QueryInterface( sl, &IID_IShellLinkDataList, (void **)&dl ); ok( r == S_OK, "Failed to get interface, hr %#lx.\n", r);
+ /* test null obj case */ + r = IShellLinkW_QueryInterface( sl, &IID_IShellLinkDataList, NULL ); + ok(r == E_POINTER, "Unexpected hr %#lx.\n", r); + flags = 0; r = IShellLinkDataList_GetFlags( dl, &flags ); ok( r == S_OK, "GetFlags failed\n");