Bug 1640091 - Make sure we TRRServiceChannel::mProxyRequest is initialized and used r=kershaw,necko-reviewers

Differential Revision: https://phabricator.services.mozilla.com/D78525
This commit is contained in:
Valentin Gosu 2020-06-08 11:38:22 +00:00
parent cb3096e639
commit cc46191834
4 changed files with 44 additions and 13 deletions

View File

@ -20,12 +20,12 @@ namespace net {
// static // static
nsresult ProxyConfigLookup::Create( nsresult ProxyConfigLookup::Create(
std::function<void(nsIProxyInfo*, nsresult)>&& aCallback, nsIURI* aURI, std::function<void(nsIProxyInfo*, nsresult)>&& aCallback, nsIURI* aURI,
uint32_t aProxyResolveFlags) { uint32_t aProxyResolveFlags, nsICancelable** aLookupCancellable) {
MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(NS_IsMainThread());
RefPtr<ProxyConfigLookup> lookUp = RefPtr<ProxyConfigLookup> lookUp =
new ProxyConfigLookup(std::move(aCallback), aURI, aProxyResolveFlags); new ProxyConfigLookup(std::move(aCallback), aURI, aProxyResolveFlags);
return lookUp->DoProxyResolve(); return lookUp->DoProxyResolve(aLookupCancellable);
} }
ProxyConfigLookup::ProxyConfigLookup( ProxyConfigLookup::ProxyConfigLookup(
@ -37,7 +37,7 @@ ProxyConfigLookup::ProxyConfigLookup(
ProxyConfigLookup::~ProxyConfigLookup() = default; ProxyConfigLookup::~ProxyConfigLookup() = default;
nsresult ProxyConfigLookup::DoProxyResolve() { nsresult ProxyConfigLookup::DoProxyResolve(nsICancelable** aLookupCancellable) {
if (!XRE_IsParentProcess()) { if (!XRE_IsParentProcess()) {
RefPtr<ProxyConfigLookup> self = this; RefPtr<ProxyConfigLookup> self = this;
bool result = ProxyConfigLookupChild::Create( bool result = ProxyConfigLookupChild::Create(
@ -77,6 +77,10 @@ nsresult ProxyConfigLookup::DoProxyResolve() {
getter_AddRefs(proxyRequest)); getter_AddRefs(proxyRequest));
} }
if (aLookupCancellable) {
proxyRequest.forget(aLookupCancellable);
}
return rv; return rv;
} }

View File

@ -22,14 +22,15 @@ class ProxyConfigLookup final : public nsIProtocolProxyCallback {
static nsresult Create( static nsresult Create(
std::function<void(nsIProxyInfo*, nsresult)>&& aCallback, nsIURI* aURI, std::function<void(nsIProxyInfo*, nsresult)>&& aCallback, nsIURI* aURI,
uint32_t aProxyResolveFlags); uint32_t aProxyResolveFlags,
nsICancelable** aLookupCancellable = nullptr);
private: private:
explicit ProxyConfigLookup( explicit ProxyConfigLookup(
std::function<void(nsIProxyInfo*, nsresult)>&& aCallback, nsIURI* aURI, std::function<void(nsIProxyInfo*, nsresult)>&& aCallback, nsIURI* aURI,
uint32_t aProxyResolveFlags); uint32_t aProxyResolveFlags);
virtual ~ProxyConfigLookup(); virtual ~ProxyConfigLookup();
nsresult DoProxyResolve(); nsresult DoProxyResolve(nsICancelable** aLookupCancellable);
std::function<void(nsIProxyInfo*, nsresult)> mCallback; std::function<void(nsIProxyInfo*, nsresult)> mCallback;
nsCOMPtr<nsIURI> mURI; nsCOMPtr<nsIURI> mURI;

View File

@ -88,6 +88,7 @@ TRRServiceChannel::TRRServiceChannel()
: HttpAsyncAborter<TRRServiceChannel>(this), : HttpAsyncAborter<TRRServiceChannel>(this),
mTopWindowOriginComputed(false), mTopWindowOriginComputed(false),
mPushedStreamId(0), mPushedStreamId(0),
mProxyRequest(nullptr, "TRRServiceChannel::mProxyRequest"),
mCurrentEventTarget(GetCurrentThreadEventTarget()) { mCurrentEventTarget(GetCurrentThreadEventTarget()) {
LOG(("TRRServiceChannel ctor [this=%p]\n", this)); LOG(("TRRServiceChannel ctor [this=%p]\n", this));
} }
@ -107,15 +108,21 @@ TRRServiceChannel::Cancel(nsresult status) {
mCanceled = true; mCanceled = true;
mStatus = status; mStatus = status;
if (mProxyRequest) {
nsCOMPtr<nsICancelable> proxyRequet; nsCOMPtr<nsICancelable> proxyRequest;
proxyRequet.swap(mProxyRequest); {
auto req = mProxyRequest.Lock();
proxyRequest.swap(*req);
}
if (proxyRequest) {
NS_DispatchToMainThread( NS_DispatchToMainThread(
NS_NewRunnableFunction( NS_NewRunnableFunction(
"CancelProxyRequest", "CancelProxyRequest",
[proxyRequet, status]() { proxyRequet->Cancel(status); }), [proxyRequest, status]() { proxyRequest->Cancel(status); }),
NS_DISPATCH_NORMAL); NS_DISPATCH_NORMAL);
} }
CancelNetworkRequest(status); CancelNetworkRequest(status);
return NS_OK; return NS_OK;
} }
@ -248,21 +255,37 @@ nsresult TRRServiceChannel::ResolveProxy() {
// TODO: bug 1625171. Consider moving proxy resolution to socket process. // TODO: bug 1625171. Consider moving proxy resolution to socket process.
RefPtr<TRRServiceChannel> self = this; RefPtr<TRRServiceChannel> self = this;
nsCOMPtr<nsICancelable> proxyRequest;
nsresult rv = ProxyConfigLookup::Create( nsresult rv = ProxyConfigLookup::Create(
[self](nsIProxyInfo* aProxyInfo, nsresult aStatus) { [self](nsIProxyInfo* aProxyInfo, nsresult aStatus) {
self->OnProxyAvailable(nullptr, nullptr, aProxyInfo, aStatus); self->OnProxyAvailable(nullptr, nullptr, aProxyInfo, aStatus);
}, },
mURI, mProxyResolveFlags); mURI, mProxyResolveFlags, getter_AddRefs(proxyRequest));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
if (!mCurrentEventTarget->IsOnCurrentThread()) { if (!mCurrentEventTarget->IsOnCurrentThread()) {
mCurrentEventTarget->Dispatch( return mCurrentEventTarget->Dispatch(
NewRunnableMethod<nsresult>("TRRServiceChannel::AsyncAbort", this, NewRunnableMethod<nsresult>("TRRServiceChannel::AsyncAbort", this,
&TRRServiceChannel::AsyncAbort, rv), &TRRServiceChannel::AsyncAbort, rv),
NS_DISPATCH_NORMAL); NS_DISPATCH_NORMAL);
} }
} }
{
auto req = mProxyRequest.Lock();
// We only set mProxyRequest if the channel hasn't already been cancelled
// on another thread.
if (!mCanceled) {
*req = proxyRequest.forget();
}
}
// If the channel has been cancelled, we go ahead and cancel the proxy
// request right here.
if (proxyRequest) {
proxyRequest->Cancel(mStatus);
}
return rv; return rv;
} }
@ -288,7 +311,10 @@ TRRServiceChannel::OnProxyAvailable(nsICancelable* request, nsIChannel* channel,
MOZ_ASSERT(mCurrentEventTarget->IsOnCurrentThread()); MOZ_ASSERT(mCurrentEventTarget->IsOnCurrentThread());
mProxyRequest = nullptr; {
auto proxyRequest = mProxyRequest.Lock();
*proxyRequest = nullptr;
}
nsresult rv; nsresult rv;

View File

@ -151,7 +151,7 @@ class TRRServiceChannel : public HttpBaseChannel,
RefPtr<HttpTransactionShell> mTransaction; RefPtr<HttpTransactionShell> mTransaction;
uint32_t mPushedStreamId; uint32_t mPushedStreamId;
RefPtr<HttpTransactionShell> mTransWithPushedStream; RefPtr<HttpTransactionShell> mTransWithPushedStream;
nsCOMPtr<nsICancelable> mProxyRequest; DataMutex<nsCOMPtr<nsICancelable>> mProxyRequest;
nsCOMPtr<nsIEventTarget> mCurrentEventTarget; nsCOMPtr<nsIEventTarget> mCurrentEventTarget;
friend class HttpAsyncAborter<TRRServiceChannel>; friend class HttpAsyncAborter<TRRServiceChannel>;