Module: wine Branch: master Commit: 357da1e8a605c00e5d4fb9edbc2bbfe1d53524a2 URL: https://source.winehq.org/git/wine.git/?a=commit;h=357da1e8a605c00e5d4fb9edb...
Author: Jacek Caban jacek@codeweavers.com Date: Tue May 8 18:18:06 2018 +0200
urlmon: Store aggregated protocol handler IUnknown in BindProtocol.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/urlmon/bindprot.c | 18 +++++++++++++----- dlls/urlmon/urlmon_main.h | 1 + 2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c index 47c972b..6ee9dbc 100644 --- a/dlls/urlmon/bindprot.c +++ b/dlls/urlmon/bindprot.c @@ -338,6 +338,10 @@ static void release_protocol_handler(BindProtocol *This) IWinInetHttpInfo_Release(This->wininet_http_info); This->wininet_http_info = NULL; } + if(This->protocol_unk) { + IUnknown_Release(This->protocol_unk); + This->protocol_unk = NULL; + } if(This->protocol) { IInternetProtocol_Release(This->protocol); This->protocol = NULL; @@ -499,6 +503,7 @@ static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr IServiceProvider *service_provider; BOOL urlmon_protocol = FALSE; CLSID clsid = IID_NULL; + IUnknown *protocol_unk = NULL; LPOLESTR clsid_str; HRESULT hres;
@@ -527,7 +532,6 @@ static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr
if(!protocol) { IClassFactory *cf; - IUnknown *unk;
hres = get_protocol_handler(pUri, &clsid, &urlmon_protocol, &cf); if(FAILED(hres)) @@ -538,17 +542,20 @@ static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr IClassFactory_Release(cf); if(FAILED(hres)) return hres; + protocol_unk = (IUnknown*)protocol; + IUnknown_AddRef(protocol_unk); }else { hres = IClassFactory_CreateInstance(cf, (IUnknown*)&This->IInternetBindInfo_iface, - &IID_IUnknown, (void**)&unk); + &IID_IUnknown, (void**)&protocol_unk); IClassFactory_Release(cf); if(FAILED(hres)) return hres;
- hres = IUnknown_QueryInterface(unk, &IID_IInternetProtocol, (void**)&protocol); - IUnknown_Release(unk); - if(FAILED(hres)) + hres = IUnknown_QueryInterface(protocol_unk, &IID_IInternetProtocol, (void**)&protocol); + if(FAILED(hres)) { + IUnknown_Release(protocol_unk); return hres; + } } }
@@ -556,6 +563,7 @@ static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_PROTOCOLCLASSID, clsid_str); CoTaskMemFree(clsid_str);
+ This->protocol_unk = protocol_unk; This->protocol = protocol;
if(urlmon_protocol) { diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index a4a1c78..a22d952 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -176,6 +176,7 @@ typedef struct {
LONG ref;
+ IUnknown *protocol_unk; IInternetProtocol *protocol; IWinInetInfo *wininet_info; IWinInetHttpInfo *wininet_http_info;