Jacek Caban : urlmon: Don' t store IWinInetHttpInfo reference in BindProtocol.

Alexandre Julliard julliard at winehq.org
Tue May 8 15:58:58 CDT 2018


Module: wine
Branch: master
Commit: 73fd4b09aeda2240e3ad8c9a11f25e491e74bb27
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=73fd4b09aeda2240e3ad8c9a11f25e491e74bb27

Author: Jacek Caban <jacek at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;




More information about the wine-cvs mailing list