Jacek Caban : mshtml: Don't send https referrer to non-https channel.

Alexandre Julliard julliard at winehq.org
Wed Aug 3 18:09:17 CDT 2016


Module: wine
Branch: master
Commit: 3cb45c4c8dd18fbade48b86d4f2657043b85e119
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3cb45c4c8dd18fbade48b86d4f2657043b85e119

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Aug  3 15:53:13 2016 +0200

mshtml: Don't send https referrer to non-https channel.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/nsio.c | 35 +++++++++++++++++++++++++++++++----
 1 file changed, 31 insertions(+), 4 deletions(-)

diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 2d6b5d7..cd6c21f 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -1301,17 +1301,44 @@ static nsresult NSAPI nsChannel_GetReferrerPolicy(nsIHttpChannel *iface, UINT32
 static nsresult NSAPI nsChannel_SetReferrerWithPolicy(nsIHttpChannel *iface, nsIURI *aReferrer, UINT32 aReferrerPolicy)
 {
     nsChannel *This = impl_from_nsIHttpChannel(iface);
+    DWORD channel_scheme, referrer_scheme;
+    nsWineURI *referrer;
+    nsresult nsres;
 
     TRACE("(%p)->(%p %d)\n", This, aReferrer, aReferrerPolicy);
 
     if(aReferrerPolicy)
         FIXME("refferer policy %d not implemented\n", aReferrerPolicy);
 
-    if(aReferrer)
-        nsIURI_AddRef(aReferrer);
-    if(This->referrer)
+    if(This->referrer) {
         nsIURI_Release(This->referrer);
-    This->referrer = aReferrer;
+        This->referrer = NULL;
+    }
+    if(!aReferrer)
+        return NS_OK;
+
+    nsres = nsIURI_QueryInterface(aReferrer, &IID_nsWineURI, (void**)&referrer);
+    if(NS_FAILED(nsres))
+        return NS_OK;
+
+    if(!ensure_uri(referrer)) {
+        nsIFileURL_Release(&referrer->nsIFileURL_iface);
+        return NS_ERROR_UNEXPECTED;
+    }
+
+    if(!ensure_uri(This->uri) || FAILED(IUri_GetScheme(This->uri->uri, &channel_scheme)))
+        channel_scheme = INTERNET_SCHEME_UNKNOWN;
+
+    if(FAILED(IUri_GetScheme(referrer->uri, &referrer_scheme)))
+        referrer_scheme = INTERNET_SCHEME_UNKNOWN;
+
+    if(referrer_scheme == INTERNET_SCHEME_HTTPS && channel_scheme != INTERNET_SCHEME_HTTPS) {
+        TRACE("Ignoring https referrer on non-https channel\n");
+        nsIFileURL_Release(&referrer->nsIFileURL_iface);
+        return NS_OK;
+    }
+
+    This->referrer = (nsIURI*)&referrer->nsIFileURL_iface;
     return NS_OK;
 }
 




More information about the wine-cvs mailing list