Jacek Caban : urlmon: Don' t store IWinInetHttpInfo reference in BindProtocol.
Module: wine Branch: master Commit: 73fd4b09aeda2240e3ad8c9a11f25e491e74bb27 URL: https://source.winehq.org/git/wine.git/?a=commit;h=73fd4b09aeda2240e3ad8c9a1... Author: Jacek Caban <jacek(a)codeweavers.com> Date: Tue May 8 18:18:11 2018 +0200 urlmon: Don't store IWinInetHttpInfo reference in BindProtocol. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/urlmon/binding.c | 31 ++++++++++++++++++++++++------- dlls/urlmon/bindprot.c | 5 ----- dlls/urlmon/urlmon_main.h | 1 - 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c index 88b3c1c..ea3b81c 100644 --- a/dlls/urlmon/binding.c +++ b/dlls/urlmon/binding.c @@ -800,12 +800,20 @@ static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void *ppv = &This->IWinInetHttpInfo_iface; }else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) { - TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv); + IWinInetHttpInfo *http_info; + HRESULT hres; - if(!This->protocol->wininet_http_info) - return E_NOINTERFACE; + TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv); - *ppv = &This->IWinInetHttpInfo_iface; + /* NOTE: This violidates COM rules, but tests prove that we should do it */ + if(This->protocol->protocol_unk) { + hres = IUnknown_QueryInterface(This->protocol->protocol_unk, &IID_IWinInetHttpInfo, + (void**)&http_info); + if(SUCCEEDED(hres)) { + IWinInetHttpInfo_Release(http_info); + *ppv = &This->IWinInetHttpInfo_iface; + } + } } if(*ppv) { @@ -1318,13 +1326,22 @@ static HRESULT WINAPI WinInetHttpInfo_QueryInfo(IWinInetHttpInfo *iface, DWORD d void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved) { Binding *This = impl_from_IWinInetHttpInfo(iface); + IWinInetHttpInfo *http_info; + HRESULT hres; + TRACE("(%p)->(%x %p %p %p %p)\n", This, dwOption, pBuffer, pcbBuffer, pdwFlags, pdwReserved); - if(!This->protocol->wininet_http_info) + if(!This->protocol->protocol_unk) + return E_FAIL; + + hres = IUnknown_QueryInterface(This->protocol->protocol_unk, &IID_IWinInetHttpInfo, + (void**)&http_info); + if(FAILED(hres)) return E_FAIL; - return IWinInetHttpInfo_QueryInfo(This->protocol->wininet_http_info, - dwOption, pBuffer, pcbBuffer, pdwFlags, pdwReserved); + hres = IWinInetHttpInfo_QueryInfo(http_info, dwOption, pBuffer, pcbBuffer, pdwFlags, pdwReserved); + IWinInetHttpInfo_Release(http_info); + return hres; } static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl = { diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c index 6ee9dbc..eeab3d5 100644 --- a/dlls/urlmon/bindprot.c +++ b/dlls/urlmon/bindprot.c @@ -334,10 +334,6 @@ static void release_protocol_handler(BindProtocol *This) IWinInetInfo_Release(This->wininet_info); This->wininet_info = NULL; } - if(This->wininet_http_info) { - IWinInetHttpInfo_Release(This->wininet_http_info); - This->wininet_http_info = NULL; - } if(This->protocol_unk) { IUnknown_Release(This->protocol_unk); This->protocol_unk = NULL; @@ -568,7 +564,6 @@ static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr if(urlmon_protocol) { IInternetProtocol_QueryInterface(protocol, &IID_IWinInetInfo, (void**)&This->wininet_info); - IInternetProtocol_QueryInterface(protocol, &IID_IWinInetHttpInfo, (void**)&This->wininet_http_info); } set_binding_sink(This, pOIProtSink, pOIBindInfo); diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index a22d952..b708921 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -179,7 +179,6 @@ typedef struct { IUnknown *protocol_unk; IInternetProtocol *protocol; IWinInetInfo *wininet_info; - IWinInetHttpInfo *wininet_http_info; IInternetBindInfo *bind_info; IInternetProtocolSink *protocol_sink;
participants (1)
-
Alexandre Julliard