Bug 1382178 - check null pointer before using; r?bagder
MozReview-Commit-ID: CjfWL39mYSP
--- a/netwerk/protocol/http/nsHttpChannel.cpp
+++ b/netwerk/protocol/http/nsHttpChannel.cpp
@@ -2261,20 +2261,21 @@ nsHttpChannel::ProcessResponse()
}
if (referrer) {
nsCOMPtr<nsILoadContextInfo> lci = GetLoadContextInfo(this);
mozilla::net::Predictor::UpdateCacheability(referrer, mURI, httpStatus,
mRequestHead, mResponseHead,
lci);
}
- if (mTransaction->ProxyConnectFailed()) {
+ if (mTransaction && mTransaction->ProxyConnectFailed()) {
// Only allow 407 (authentication required) to continue
- if (httpStatus != 407)
+ if (httpStatus != 407) {
return ProcessFailedProxyConnect(httpStatus);
+ }
// If proxy CONNECT response needs to complete, wait to process connection
// for Strict-Transport-Security.
} else {
// Given a successful connection, process any STS or PKP data that's
// relevant.
DebugOnly<nsresult> rv = ProcessSecurityHeaders();
MOZ_ASSERT(NS_SUCCEEDED(rv), "ProcessSTSHeader failed, continuing load.");
}
@@ -2322,17 +2323,17 @@ nsHttpChannel::ContinueProcessResponse1(
return CallOnStartRequest();
}
uint32_t httpStatus = mResponseHead->Status();
// Cookies and Alt-Service should not be handled on proxy failure either.
// This would be consolidated with ProcessSecurityHeaders but it should
// happen after OnExamineResponse.
- if (!mTransaction->ProxyConnectFailed() && (httpStatus != 407)) {
+ if (!(mTransaction && mTransaction->ProxyConnectFailed()) && (httpStatus != 407)) {
nsAutoCString cookie;
if (NS_SUCCEEDED(mResponseHead->GetHeader(nsHttp::Set_Cookie, cookie))) {
SetCookie(cookie.get());
}
if ((httpStatus < 500) && (httpStatus != 421)) {
ProcessAltService();
}
}
@@ -2501,37 +2502,40 @@ nsHttpChannel::ContinueProcessResponse2(
// When a custom auth header fails, we don't want to try
// any cached credentials, nor we want to ask the user.
// It's up to the consumer to re-try w/o setting a custom
// auth header if cached credentials should be attempted.
rv = NS_ERROR_FAILURE;
} else {
rv = mAuthProvider->ProcessAuthentication(
httpStatus,
- mConnectionInfo->EndToEndSSL() && mTransaction->ProxyConnectFailed());
+ mConnectionInfo->EndToEndSSL() &&
+ mTransaction && mTransaction->ProxyConnectFailed());
}
if (rv == NS_ERROR_IN_PROGRESS) {
// authentication prompt has been invoked and result
// is expected asynchronously
mAuthRetryPending = true;
- if (httpStatus == 407 || mTransaction->ProxyConnectFailed())
+ if (httpStatus == 407 ||
+ (mTransaction && mTransaction->ProxyConnectFailed()))
mProxyAuthPending = true;
// suspend the transaction pump to stop receiving the
// unauthenticated content data. We will throw that data
// away when user provides credentials or resume the pump
// when user refuses to authenticate.
LOG(("Suspending the transaction, asynchronously prompting for credentials"));
mTransactionPump->Suspend();
rv = NS_OK;
} else if (NS_FAILED(rv)) {
LOG(("ProcessAuthentication failed [rv=%" PRIx32 "]\n",
static_cast<uint32_t>(rv)));
- if (mTransaction->ProxyConnectFailed())
+ if (mTransaction && mTransaction->ProxyConnectFailed()) {
return ProcessFailedProxyConnect(httpStatus);
+ }
if (!mAuthRetryPending) {
rv = mAuthProvider->CheckForSuperfluousAuth();
if (NS_FAILED(rv)) {
LOG(("CheckForSuperfluousAuth failed [rv=%x]\n",
static_cast<uint32_t>(rv)));
}
}
rv = ProcessNormal();