Bug 1011354 - Use a mutex to guard access to nsHttpTransaction::mConnection.

This commit is contained in:
Valentin Gosu
2014-10-12 17:16:50 +02:00
committed by Pale Moon
parent 010fb1bf08
commit 7fb4f93f56
3 changed files with 31 additions and 10 deletions
+2 -2
View File
@@ -5006,7 +5006,7 @@ nsHttpChannel::OnStopRequest(nsIRequest *request, nsISupports *ctxt, nsresult st
//
nsRefPtr<nsAHttpConnection> conn;
if (authRetry && (mCaps & NS_HTTP_STICKY_CONNECTION)) {
conn = mTransaction->Connection();
conn = mTransaction->GetConnectionReference();
// This is so far a workaround to fix leak when reusing unpersistent
// connection for authentication retry. See bug 459620 comment 4
// for details.
@@ -5016,7 +5016,7 @@ nsHttpChannel::OnStopRequest(nsIRequest *request, nsISupports *ctxt, nsresult st
nsRefPtr<nsAHttpConnection> stickyConn;
if (mCaps & NS_HTTP_STICKY_CONNECTION)
stickyConn = mTransaction->Connection();
stickyConn = mTransaction->GetConnectionReference();
// at this point, we're done with the transaction
mTransactionTimings = mTransaction->Timings();
+24 -7
View File
@@ -81,7 +81,7 @@ LogHeaders(const char *lineStart)
//-----------------------------------------------------------------------------
nsHttpTransaction::nsHttpTransaction()
: mCallbacksLock("transaction mCallbacks lock")
: mLock("transaction lock")
, mRequestSize(0)
, mConnection(nullptr)
, mConnInfo(nullptr)
@@ -340,12 +340,21 @@ nsHttpTransaction::Init(uint32_t caps,
return NS_OK;
}
// This method should only be used on the socket thread
nsAHttpConnection *
nsHttpTransaction::Connection()
{
return mConnection;
}
already_AddRefed<nsAHttpConnection>
nsHttpTransaction::GetConnectionReference()
{
MutexAutoLock lock(mLock);
nsRefPtr<nsAHttpConnection> connection = mConnection;
return connection.forget();
}
nsHttpResponseHead *
nsHttpTransaction::TakeResponseHead()
{
@@ -409,8 +418,11 @@ nsHttpTransaction::TakeSubTransactions(
void
nsHttpTransaction::SetConnection(nsAHttpConnection *conn)
{
NS_IF_RELEASE(mConnection);
NS_IF_ADDREF(mConnection = conn);
{
MutexAutoLock lock(mLock);
NS_IF_RELEASE(mConnection);
NS_IF_ADDREF(mConnection = conn);
}
if (conn) {
MOZ_EVENT_TRACER_EXEC(static_cast<nsAHttpTransaction*>(this),
@@ -421,7 +433,7 @@ nsHttpTransaction::SetConnection(nsAHttpConnection *conn)
void
nsHttpTransaction::GetSecurityCallbacks(nsIInterfaceRequestor **cb)
{
MutexAutoLock lock(mCallbacksLock);
MutexAutoLock lock(mLock);
NS_IF_ADDREF(*cb = mCallbacks);
}
@@ -429,7 +441,7 @@ void
nsHttpTransaction::SetSecurityCallbacks(nsIInterfaceRequestor* aCallbacks)
{
{
MutexAutoLock lock(mCallbacksLock);
MutexAutoLock lock(mLock);
mCallbacks = aCallbacks;
}
@@ -825,8 +837,10 @@ nsHttpTransaction::Close(nsresult reason)
mTimings.responseEnd.IsNull() && !mTimings.responseStart.IsNull())
mTimings.responseEnd = TimeStamp::Now();
if (relConn && mConnection)
if (relConn && mConnection) {
MutexAutoLock lock(mLock);
NS_RELEASE(mConnection);
}
mStatus = reason;
mTransactionDone = true; // forcibly flag the transaction as complete
@@ -959,7 +973,10 @@ nsHttpTransaction::Restart()
// clear old connection state...
mSecurityInfo = 0;
NS_IF_RELEASE(mConnection);
if (mConnection) {
MutexAutoLock lock(mLock);
NS_RELEASE(mConnection);
}
// disable pipelining for the next attempt in case pipelining caused the
// reset. this is being overly cautious since we don't know if pipelining
+5 -1
View File
@@ -96,6 +96,10 @@ public:
// will drop any reference to the response headers after this call.
nsHttpResponseHead *TakeResponseHead();
// Provides a thread safe reference of the connection
// nsHttpTransaction::Connection should only be used on the socket thread
already_AddRefed<nsAHttpConnection> GetConnectionReference();
// Called to find out if the transaction generated a complete response.
bool ResponseIsComplete() { return mResponseIsComplete; }
@@ -164,7 +168,7 @@ private:
nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
};
mozilla::Mutex mCallbacksLock;
mozilla::Mutex mLock;
nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
nsCOMPtr<nsITransportEventSink> mTransportSink;