Bug 877562 - protect appcache hash tables with a mutex, r=jduell
This commit is contained in:
45
netwerk/cache/nsDiskCacheDeviceSQL.cpp
vendored
45
netwerk/cache/nsDiskCacheDeviceSQL.cpp
vendored
@@ -653,7 +653,10 @@ nsApplicationCache::~nsApplicationCache()
|
||||
if (!mDevice)
|
||||
return;
|
||||
|
||||
mDevice->mCaches.Remove(mClientID);
|
||||
{
|
||||
MutexAutoLock lock(mDevice->mLock);
|
||||
mDevice->mCaches.Remove(mClientID);
|
||||
}
|
||||
|
||||
// If this isn't an active cache anymore, it can be destroyed.
|
||||
if (mValid && !mDevice->IsActiveCache(mGroup, mClientID))
|
||||
@@ -882,6 +885,7 @@ nsOfflineCacheDevice::nsOfflineCacheDevice()
|
||||
, mCacheCapacity(0)
|
||||
, mDeltaCounter(0)
|
||||
, mAutoShutdown(false)
|
||||
, mLock("nsOfflineCacheDevice.lock")
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1343,6 +1347,8 @@ nsOfflineCacheDevice::BuildApplicationCacheGroupID(nsIURI *aManifestURL,
|
||||
nsresult
|
||||
nsOfflineCacheDevice::InitActiveCaches()
|
||||
{
|
||||
MutexAutoLock lock(mLock);
|
||||
|
||||
mCaches.Init();
|
||||
mActiveCachesByGroup.Init();
|
||||
|
||||
@@ -1394,8 +1400,11 @@ nsOfflineCacheDevice::Shutdown()
|
||||
{
|
||||
NS_ENSURE_TRUE(mDB, NS_ERROR_NOT_INITIALIZED);
|
||||
|
||||
if (mCaches.IsInitialized())
|
||||
mCaches.EnumerateRead(ShutdownApplicationCache, this);
|
||||
{
|
||||
MutexAutoLock lock(mLock);
|
||||
if (mCaches.IsInitialized())
|
||||
mCaches.EnumerateRead(ShutdownApplicationCache, this);
|
||||
}
|
||||
|
||||
{
|
||||
EvictionObserver evictionObserver(mDB, mEvictionFunction);
|
||||
@@ -2233,18 +2242,21 @@ nsOfflineCacheDevice::GetGroupsTimeOrdered(uint32_t *count,
|
||||
bool
|
||||
nsOfflineCacheDevice::IsLocked(const nsACString &key)
|
||||
{
|
||||
MutexAutoLock lock(mLock);
|
||||
return mLockedEntries.GetEntry(key);
|
||||
}
|
||||
|
||||
void
|
||||
nsOfflineCacheDevice::Lock(const nsACString &key)
|
||||
{
|
||||
MutexAutoLock lock(mLock);
|
||||
mLockedEntries.PutEntry(key);
|
||||
}
|
||||
|
||||
void
|
||||
nsOfflineCacheDevice::Unlock(const nsACString &key)
|
||||
{
|
||||
MutexAutoLock lock(mLock);
|
||||
mLockedEntries.RemoveEntry(key);
|
||||
}
|
||||
|
||||
@@ -2317,6 +2329,7 @@ nsOfflineCacheDevice::CreateApplicationCache(const nsACString &group,
|
||||
if (!weak)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
MutexAutoLock lock(mLock);
|
||||
mCaches.Put(clientID, weak);
|
||||
|
||||
cache.swap(*out);
|
||||
@@ -2327,6 +2340,14 @@ nsOfflineCacheDevice::CreateApplicationCache(const nsACString &group,
|
||||
nsresult
|
||||
nsOfflineCacheDevice::GetApplicationCache(const nsACString &clientID,
|
||||
nsIApplicationCache **out)
|
||||
{
|
||||
MutexAutoLock lock(mLock);
|
||||
return GetApplicationCache_Unlocked(clientID, out);
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsOfflineCacheDevice::GetApplicationCache_Unlocked(const nsACString &clientID,
|
||||
nsIApplicationCache **out)
|
||||
{
|
||||
*out = nullptr;
|
||||
|
||||
@@ -2365,9 +2386,11 @@ nsOfflineCacheDevice::GetActiveCache(const nsACString &group,
|
||||
{
|
||||
*out = nullptr;
|
||||
|
||||
MutexAutoLock lock(mLock);
|
||||
|
||||
nsCString *clientID;
|
||||
if (mActiveCachesByGroup.Get(group, &clientID))
|
||||
return GetApplicationCache(*clientID, out);
|
||||
return GetApplicationCache_Unlocked(*clientID, out);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
@@ -2384,6 +2407,8 @@ nsOfflineCacheDevice::DeactivateGroup(const nsACString &group)
|
||||
rv = statement->Execute();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
MutexAutoLock lock(mLock);
|
||||
|
||||
if (mActiveCachesByGroup.Get(group, &active))
|
||||
{
|
||||
mActiveCaches.RemoveEntry(*active);
|
||||
@@ -2445,8 +2470,11 @@ nsOfflineCacheDevice::CanUseCache(nsIURI *keyURI,
|
||||
const nsACString &clientID,
|
||||
nsILoadContext *loadContext)
|
||||
{
|
||||
if (!mActiveCaches.Contains(clientID))
|
||||
return false;
|
||||
{
|
||||
MutexAutoLock lock(mLock);
|
||||
if (!mActiveCaches.Contains(clientID))
|
||||
return false;
|
||||
}
|
||||
|
||||
nsAutoCString groupID;
|
||||
nsresult rv = GetGroupForCache(clientID, groupID);
|
||||
@@ -2598,6 +2626,8 @@ nsOfflineCacheDevice::ActivateCache(const nsCSubstring &group,
|
||||
rv = statement->Execute();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
MutexAutoLock lock(mLock);
|
||||
|
||||
nsCString *active;
|
||||
if (mActiveCachesByGroup.Get(group, &active))
|
||||
{
|
||||
@@ -2620,6 +2650,7 @@ nsOfflineCacheDevice::IsActiveCache(const nsCSubstring &group,
|
||||
const nsCSubstring &clientID)
|
||||
{
|
||||
nsCString *active = nullptr;
|
||||
MutexAutoLock lock(mLock);
|
||||
return mActiveCachesByGroup.Get(group, &active) && *active == clientID;
|
||||
}
|
||||
|
||||
@@ -2685,6 +2716,8 @@ nsOfflineCacheDevice::AutoShutdown(nsIApplicationCache * aAppCache)
|
||||
|
||||
nsAutoCString clientID;
|
||||
aAppCache->GetClientID(clientID);
|
||||
|
||||
MutexAutoLock lock(mLock);
|
||||
mCaches.Remove(clientID);
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user