[PATCH 0/1] MR7451: dlls/shell32: Fix IUnknown::QueryInterface() to meet spec
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(a)antitrust.cc> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/7451
From: Edward O'Callaghan <edward(a)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(a)antitrust.cc> --- dlls/shell32/shelllink.c | 19 ++++++++++--------- 1 file changed, 10 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; } /****************************************************************************** -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7451
This needs a test. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/7451#note_96303
participants (3)
-
Edward O'Callaghan -
Edward OC (@funfunctor) -
Nikolay Sivov (@nsivov)