Module: wine Branch: master Commit: 52aefc06114441c5b6b2cbcbd84e6756c6286275 URL: https://source.winehq.org/git/wine.git/?a=commit;h=52aefc06114441c5b6b2cbcbd...
Author: Jacek Caban jacek@codeweavers.com Date: Tue May 22 10:13:59 2018 +0200
urlmon: Ensure that inner protocol handler reference is released after other references.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/urlmon/bindprot.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c index 5965244..42d3d21 100644 --- a/dlls/urlmon/bindprot.c +++ b/dlls/urlmon/bindprot.c @@ -309,10 +309,6 @@ static ULONG WINAPI BindProtocol_AddRef(IInternetProtocolEx *iface)
static void release_protocol_handler(BindProtocol *This) { - if(This->protocol_unk) { - IUnknown_Release(This->protocol_unk); - This->protocol_unk = NULL; - } if(This->protocol) { IInternetProtocol_Release(This->protocol); This->protocol = NULL; @@ -326,6 +322,10 @@ static void release_protocol_handler(BindProtocol *This) IInternetProtocolSink_Release(This->protocol_sink_handler); This->protocol_sink_handler = &This->default_protocol_handler.IInternetProtocolSink_iface; } + if(This->protocol_unk) { + IUnknown_Release(This->protocol_unk); + This->protocol_unk = NULL; + } }
static ULONG WINAPI BindProtocol_Release(IInternetProtocolEx *iface) @@ -654,24 +654,25 @@ static HRESULT WINAPI ProtocolHandler_Start(IInternetProtocol *iface, LPCWSTR sz static HRESULT WINAPI ProtocolHandler_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData) { BindProtocol *This = impl_from_IInternetProtocol(iface); - IInternetProtocol *protocol; + IInternetProtocol *protocol = NULL; HRESULT hres;
TRACE("(%p)->(%p)\n", This, pProtocolData);
/* FIXME: This should not be needed. */ - if(!This->protocol && This->protocol_unk) { + if(!This->protocol) { + if(!This->protocol_unk) + return E_FAIL; hres = IUnknown_QueryInterface(This->protocol_unk, &IID_IInternetProtocol, (void**)&protocol); if(FAILED(hres)) return E_FAIL; - }else { - IInternetProtocol_AddRef(protocol = This->protocol); }
- hres = IInternetProtocol_Continue(protocol, pProtocolData); + hres = IInternetProtocol_Continue(protocol ? protocol : This->protocol, pProtocolData);
heap_free(pProtocolData); - IInternetProtocol_Release(protocol); + if(protocol) + IInternetProtocol_Release(protocol); return hres; }