Module: wine Branch: master Commit: 9a4959de4a4aeeacdd886a222b7f2db60b25f045 URL: https://source.winehq.org/git/wine.git/?a=commit;h=9a4959de4a4aeeacdd886a222...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Fri Jan 24 12:21:29 2020 +0300
ole32: Fix IsEqual() for antimoniker.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ole32/antimoniker.c | 28 +++++++++++++++++----------- dlls/ole32/tests/moniker.c | 5 ----- 2 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/dlls/ole32/antimoniker.c b/dlls/ole32/antimoniker.c index bff6500fa5..9b02129021 100644 --- a/dlls/ole32/antimoniker.c +++ b/dlls/ole32/antimoniker.c @@ -53,6 +53,7 @@ static inline AntiMonikerImpl *impl_from_IROTData(IROTData *iface) return CONTAINING_RECORD(iface, AntiMonikerImpl, IROTData_iface); }
+static AntiMonikerImpl *unsafe_impl_from_IMoniker(IMoniker *iface);
/******************************************************************************* * AntiMoniker_QueryInterface @@ -308,22 +309,20 @@ AntiMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker /****************************************************************************** * AntiMoniker_IsEqual ******************************************************************************/ -static HRESULT WINAPI -AntiMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker) +static HRESULT WINAPI AntiMonikerImpl_IsEqual(IMoniker *iface, IMoniker *other) { - DWORD mkSys; - - TRACE("(%p,%p)\n",iface,pmkOtherMoniker); + AntiMonikerImpl *moniker = impl_from_IMoniker(iface), *other_moniker;
- if (pmkOtherMoniker==NULL) - return S_FALSE; + TRACE("%p, %p.\n", iface, other);
- IMoniker_IsSystemMoniker(pmkOtherMoniker,&mkSys); + if (!other) + return E_INVALIDARG;
- if (mkSys==MKSYS_ANTIMONIKER) - return S_OK; - else + other_moniker = unsafe_impl_from_IMoniker(other); + if (!other_moniker) return S_FALSE; + + return moniker->count == other_moniker->count ? S_OK : S_FALSE; }
/****************************************************************************** @@ -588,6 +587,13 @@ static const IMonikerVtbl VT_AntiMonikerImpl = AntiMonikerImpl_IsSystemMoniker };
+static AntiMonikerImpl *unsafe_impl_from_IMoniker(IMoniker *iface) +{ + if (iface->lpVtbl != &VT_AntiMonikerImpl) + return NULL; + return CONTAINING_RECORD(iface, AntiMonikerImpl, IMoniker_iface); +} + /********************************************************************************/ /* Virtual function table for the IROTData class. */ static const IROTDataVtbl VT_ROTDataImpl = diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c index dff6cbbe57..65cd279b1a 100644 --- a/dlls/ole32/tests/moniker.c +++ b/dlls/ole32/tests/moniker.c @@ -2331,11 +2331,9 @@ todo_wine ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMoniker_IsEqual(moniker, moniker2); -todo_wine ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr);
hr = IMoniker_IsEqual(moniker2, moniker); -todo_wine ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr);
hr = IMoniker_Hash(moniker, &hash); @@ -2374,11 +2372,9 @@ todo_wine ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMoniker_IsEqual(moniker, moniker2); -todo_wine ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr);
hr = IMoniker_IsEqual(moniker2, moniker); -todo_wine ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr);
hr = IMoniker_Hash(moniker, &hash); @@ -2403,7 +2399,6 @@ todo_wine ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMoniker_IsEqual(moniker, NULL); -todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
IStream_Release(stream);