Module: wine Branch: master Commit: 3cb45c4c8dd18fbade48b86d4f2657043b85e119 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3cb45c4c8dd18fbade48b86d4f...
Author: Jacek Caban jacek@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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; }