diff --git a/netwerk/protocol/http/nsHttpConnectionMgr.cpp b/netwerk/protocol/http/nsHttpConnectionMgr.cpp index 8e011abcd067..77a7bc76f8d3 100644 --- a/netwerk/protocol/http/nsHttpConnectionMgr.cpp +++ b/netwerk/protocol/http/nsHttpConnectionMgr.cpp @@ -789,8 +789,9 @@ nsHttpConnectionMgr::UpdateCoalescingForNewConn(nsHttpConnection *newConn, MOZ_ASSERT(OnSocketThread(), "not on socket thread"); MOZ_ASSERT(newConn); MOZ_ASSERT(newConn->ConnectionInfo()); - MOZ_ASSERT(ent); + MOZ_DIAGNOSTIC_ASSERT(ent); MOZ_ASSERT(mCT.GetWeak(newConn->ConnectionInfo()->HashKey()) == ent); + CheckConnEntryMustBeInmCT(ent->mConnInfo); nsHttpConnection *existingConn = FindCoalescableConnection(ent, true); if (existingConn) { @@ -1253,6 +1254,7 @@ nsHttpConnectionMgr::AtActiveConnectionLimit(nsConnectionEntry *ent, uint32_t ca void nsHttpConnectionMgr::ClosePersistentConnections(nsConnectionEntry *ent) { + CheckConnEntryMustBeInmCT(ent->mConnInfo); LOG(("nsHttpConnectionMgr::ClosePersistentConnections [ci=%s]\n", ent->mConnInfo->HashKey().get())); while (ent->mIdleConns.Length()) { @@ -1661,6 +1663,7 @@ nsHttpConnectionMgr::DispatchTransaction(nsConnectionEntry *ent, nsHttpTransaction *trans, nsHttpConnection *conn) { + CheckConnEntryMustBeInmCT(ent->mConnInfo); uint32_t caps = trans->Caps(); int32_t priority = trans->Priority(); nsresult rv; @@ -1756,6 +1759,7 @@ nsHttpConnectionMgr::DispatchAbstractTransaction(nsConnectionEntry *ent, int32_t priority) { MOZ_DIAGNOSTIC_ASSERT(ent); + CheckConnEntryMustBeInmCT(ent->mConnInfo); nsresult rv; MOZ_ASSERT(!conn->UsingSpdy(), "Spdy Must Not Use DispatchAbstractTransaction"); @@ -1904,6 +1908,7 @@ void nsHttpConnectionMgr::AddActiveConn(nsHttpConnection *conn, nsConnectionEntry *ent) { + CheckConnEntryMustBeInmCT(ent->mConnInfo); ent->mActiveConns.AppendElement(conn); mNumActiveConns++; ActivateTimeoutTick(); @@ -2091,7 +2096,8 @@ nsHttpConnection * nsHttpConnectionMgr::GetSpdyActiveConn(nsConnectionEntry *ent) { MOZ_ASSERT(OnSocketThread(), "not on socket thread"); - MOZ_ASSERT(ent); + MOZ_DIAGNOSTIC_ASSERT(ent); + CheckConnEntryMustBeInmCT(ent->mConnInfo); nsHttpConnection *experienced = nullptr; nsHttpConnection *noExperience = nullptr; @@ -2413,6 +2419,7 @@ nsHttpConnectionMgr::OnMsgCancelTransaction(int32_t reason, ARefBase *param) for (uint32_t index = 0; ent && (index < ent->mActiveConns.Length()); ++index) { + CheckConnEntryMustBeInmCT(ent->mConnInfo); nsHttpConnection *activeConn = ent->mActiveConns[index]; nsAHttpTransaction *liveTransaction = activeConn->Transaction(); if (liveTransaction && liveTransaction->IsNullTransaction()) { @@ -4061,6 +4068,7 @@ nsHalfOpenSocket::OnOutputStreamReady(nsIAsyncOutputStream *out) MOZ_DIAGNOSTIC_ASSERT(out == mStreamOut || out == mBackupStreamOut, "stream mismatch"); MOZ_DIAGNOSTIC_ASSERT(mEnt); + gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo); LOG(("nsHalfOpenSocket::OnOutputStreamReady [this=%p ent=%s %s]\n", this, mEnt->mConnInfo->Origin(), @@ -4119,7 +4127,9 @@ nsHalfOpenSocket::OnOutputStreamReady(nsIAsyncOutputStream *out) mFastOpenInProgress = false; mConnectionNegotiatingFastOpen = nullptr; } + MOZ_DIAGNOSTIC_ASSERT(mEnt); + gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo); nsresult rv = SetupConn(out, false); if (mEnt) { mEnt->mDoNotDestroy = false; @@ -4135,6 +4145,8 @@ nsHalfOpenSocket::FastOpenEnabled() MOZ_DIAGNOSTIC_ASSERT(mEnt); + gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo); + if (!mEnt) { return false; } @@ -4187,12 +4199,15 @@ nsHalfOpenSocket::StartFastOpen() MOZ_DIAGNOSTIC_ASSERT(!mBackupTransport); MOZ_DIAGNOSTIC_ASSERT(mEnt); + gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo); + LOG(("nsHalfOpenSocket::StartFastOpen [this=%p]\n", this)); RefPtr deleteProtector(this); mFastOpenInProgress = true; + mEnt->mDoNotDestroy = true; // Remove this HalfOpen from mEnt->mHalfOpens. // The new connection will take care of closing this HalfOpen from now on! if (!mEnt->mHalfOpens.RemoveElement(this)) { @@ -4206,7 +4221,7 @@ nsHalfOpenSocket::StartFastOpen() Abandon(); return NS_ERROR_ABORT; } - mEnt->mDoNotDestroy = true; + MOZ_ASSERT(gHttpHandler->ConnMgr()->mNumHalfOpenConns); if (gHttpHandler->ConnMgr()->mNumHalfOpenConns) { // just in case gHttpHandler->ConnMgr()->mNumHalfOpenConns--; @@ -4243,6 +4258,9 @@ nsHalfOpenSocket::StartFastOpen() } else { LOG(("nsHalfOpenSocket::StartFastOpen [this=%p conn=%p]\n", this, mConnectionNegotiatingFastOpen.get())); + + gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo); + mEnt->mHalfOpenFastOpenBackups.AppendElement(this); // SetupBackupTimer should setup timer which will hold a ref to this // halfOpen. It will failed only if it cannot create timer. Anyway just @@ -4267,6 +4285,8 @@ nsHalfOpenSocket::SetFastOpenConnected(nsresult aError, bool aWillRetry) MOZ_DIAGNOSTIC_ASSERT(mFastOpenInProgress); MOZ_DIAGNOSTIC_ASSERT(mEnt); + gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo); + LOG(("nsHalfOpenSocket::SetFastOpenConnected [this=%p conn=%p error=%x]\n", this, mConnectionNegotiatingFastOpen.get(), static_cast(aError))); @@ -4327,6 +4347,7 @@ nsHalfOpenSocket::SetFastOpenConnected(nsresult aError, bool aWillRetry) // mConnectionNegotiatingFastOpen is going away and halfOpen is taking // this mSocketTransport so add halfOpen to mEnt and update // mNumActiveConns. + gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo); mEnt->mHalfOpens.AppendElement(this); gHttpHandler->ConnMgr()->mNumHalfOpenConns++; gHttpHandler->ConnMgr()->StartedConnect(); @@ -4385,6 +4406,8 @@ nsHalfOpenSocket::CancelFastOpenConnection() LOG(("nsHalfOpenSocket::CancelFastOpenConnection [this=%p conn=%p]\n", this, mConnectionNegotiatingFastOpen.get())); + gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo); + RefPtr deleteProtector(this); mEnt->mHalfOpenFastOpenBackups.RemoveElement(this); mSocketTransport->SetFastOpenCallback(nullptr); @@ -4594,6 +4617,7 @@ nsHalfOpenSocket::SetupConn(nsIAsyncOutputStream *out, MOZ_DIAGNOSTIC_ASSERT(static_cast(mEnt->mIdleConns.IndexOf(conn)) == -1); int32_t idx = mEnt->mActiveConns.IndexOf(conn); if (NS_SUCCEEDED(rv) && (idx != -1)) { + gHttpHandler->ConnMgr()->CheckConnEntryMustBeInmCT(mEnt->mConnInfo); mConnectionNegotiatingFastOpen = conn; } else { conn->SetFastOpen(false); @@ -5153,5 +5177,17 @@ nsHttpConnectionMgr::MoveToWildCardConnEntry(nsHttpConnectionInfo *specificCI, } } +void +nsHttpConnectionMgr::CheckConnEntryMustBeInmCT(nsHttpConnectionInfo *ci) +{ + nsConnectionEntry *ent = mCT.GetWeak(ci->HashKey()); + MOZ_DIAGNOSTIC_ASSERT(ent); + if (ent->mHowItWasRemoved == nsConnectionEntry::CONN_ENTRY_CLEAR_CONNECTION_HISTORY) { + MOZ_DIAGNOSTIC_ASSERT(false); + } else if (ent->mHowItWasRemoved == nsConnectionEntry::CONN_ENTRY_REMOVED_SHUTDOWN) { + MOZ_DIAGNOSTIC_ASSERT(false); + } +} + } // namespace net } // namespace mozilla diff --git a/netwerk/protocol/http/nsHttpConnectionMgr.h b/netwerk/protocol/http/nsHttpConnectionMgr.h index 87e9632ee593..1d4100ce52d0 100644 --- a/netwerk/protocol/http/nsHttpConnectionMgr.h +++ b/netwerk/protocol/http/nsHttpConnectionMgr.h @@ -747,6 +747,9 @@ private: nsTArray>* GetTransactionPendingQHelper(nsConnectionEntry *ent, nsAHttpTransaction *trans); + + // This is only a diagnostic check end it will e removed soon. + void CheckConnEntryMustBeInmCT(nsHttpConnectionInfo *ci); }; NS_DEFINE_STATIC_IID_ACCESSOR(nsHttpConnectionMgr::nsHalfOpenSocket, NS_HALFOPENSOCKET_IID)