Commit 6475717a authored by Jari Jalkanen's avatar Jari Jalkanen
Browse files

Bug 1840918 - Protect access to gDBManager of IndexedDatabaseManager....

Bug 1840918 - Protect access to gDBManager of IndexedDatabaseManager. r=dom-storage-reviewers,janv a=RyanVM

Differential Revision: https://phabricator.services.mozilla.com/D188708
parent 5b4ed52e
Loading
Loading
Loading
Loading
+40 −19
Original line number Diff line number Diff line
@@ -142,10 +142,11 @@ const char kPrefLoggingProfiler[] =
#undef IDB_PREF_LOGGING_BRANCH_ROOT
#undef IDB_PREF_BRANCH_ROOT

StaticRefPtr<IndexedDatabaseManager> gDBManager;
StaticMutex gDBManagerMutex;
StaticRefPtr<IndexedDatabaseManager> gDBManager MOZ_GUARDED_BY(gDBManagerMutex);
bool gInitialized MOZ_GUARDED_BY(gDBManagerMutex) = false;
bool gClosed MOZ_GUARDED_BY(gDBManagerMutex) = false;

Atomic<bool> gInitialized(false);
Atomic<bool> gClosed(false);
Atomic<int32_t> gDataThresholdBytes(0);
Atomic<int32_t> gMaxSerializedMsgSize(0);
Atomic<int32_t> gMaxPreloadExtraRecords(0);
@@ -227,7 +228,9 @@ Atomic<IndexedDatabaseManager::LoggingMode>
IndexedDatabaseManager* IndexedDatabaseManager::GetOrCreate() {
  NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");

  if (IsClosed()) {
  StaticMutexAutoLock lock(gDBManagerMutex);

  if (gClosed) {
    NS_ERROR("Calling GetOrCreate() after shutdown!");
    return nullptr;
  }
@@ -235,17 +238,23 @@ IndexedDatabaseManager* IndexedDatabaseManager::GetOrCreate() {
  if (!gDBManager) {
    sIsMainProcess = XRE_IsParentProcess();

    if (gInitialized) {
      NS_ERROR("Initialized more than once?!");
    }

    RefPtr<IndexedDatabaseManager> instance(new IndexedDatabaseManager());

    QM_TRY(MOZ_TO_RESULT(instance->Init()), nullptr);
    {
      StaticMutexAutoUnlock unlock(gDBManagerMutex);

    if (gInitialized.exchange(true)) {
      NS_ERROR("Initialized more than once?!");
      QM_TRY(MOZ_TO_RESULT(instance->Init()), nullptr);
    }

    gDBManager = instance;

    ClearOnShutdown(&gDBManager);

    gInitialized = true;
  }

  return gDBManager;
@@ -253,6 +262,8 @@ IndexedDatabaseManager* IndexedDatabaseManager::GetOrCreate() {

// static
IndexedDatabaseManager* IndexedDatabaseManager::Get() {
  StaticMutexAutoLock lock(gDBManagerMutex);

  // Does not return an owning reference.
  return gDBManager;
}
@@ -309,12 +320,18 @@ nsresult IndexedDatabaseManager::Init() {
}

void IndexedDatabaseManager::Destroy() {
  {
    StaticMutexAutoLock lock(gDBManagerMutex);

    // Setting the closed flag prevents the service from being recreated.
    // Don't set it though if there's no real instance created.
  if (gInitialized && gClosed.exchange(true)) {
    if (gInitialized && gClosed) {
      NS_ERROR("Shutdown more than once?!");
    }

    gClosed = true;
  }

  Preferences::UnregisterCallback(LoggingModePrefChangedCallback,
                                  kPrefLoggingDetails);

@@ -390,12 +407,16 @@ bool IndexedDatabaseManager::DefineIndexedDB(JSContext* aCx,
}

// static
bool IndexedDatabaseManager::IsClosed() { return gClosed; }
bool IndexedDatabaseManager::IsClosed() {
  StaticMutexAutoLock lock(gDBManagerMutex);

  return gClosed;
}

#ifdef DEBUG
// static
bool IndexedDatabaseManager::IsMainProcess() {
  NS_ASSERTION(gDBManager,
  NS_ASSERTION(Get(),
               "IsMainProcess() called before indexedDB has been initialized!");
  NS_ASSERTION((XRE_IsParentProcess()) == sIsMainProcess,
               "XRE_GetProcessType changed its tune!");
@@ -404,7 +425,7 @@ bool IndexedDatabaseManager::IsMainProcess() {

// static
IndexedDatabaseManager::LoggingMode IndexedDatabaseManager::GetLoggingMode() {
  MOZ_ASSERT(gDBManager,
  MOZ_ASSERT(Get(),
             "GetLoggingMode called before IndexedDatabaseManager has been "
             "initialized!");

@@ -413,7 +434,7 @@ IndexedDatabaseManager::LoggingMode IndexedDatabaseManager::GetLoggingMode() {

// static
mozilla::LogModule* IndexedDatabaseManager::GetLoggingModule() {
  MOZ_ASSERT(gDBManager,
  MOZ_ASSERT(Get(),
             "GetLoggingModule called before IndexedDatabaseManager has been "
             "initialized!");

@@ -424,7 +445,7 @@ mozilla::LogModule* IndexedDatabaseManager::GetLoggingModule() {

// static
bool IndexedDatabaseManager::FullSynchronous() {
  MOZ_ASSERT(gDBManager,
  MOZ_ASSERT(Get(),
             "FullSynchronous() called before indexedDB has been initialized!");

  return sFullSynchronousMode;
@@ -432,7 +453,7 @@ bool IndexedDatabaseManager::FullSynchronous() {

// static
uint32_t IndexedDatabaseManager::DataThreshold() {
  MOZ_ASSERT(gDBManager,
  MOZ_ASSERT(Get(),
             "DataThreshold() called before indexedDB has been initialized!");

  return gDataThresholdBytes;
@@ -441,7 +462,7 @@ uint32_t IndexedDatabaseManager::DataThreshold() {
// static
uint32_t IndexedDatabaseManager::MaxSerializedMsgSize() {
  MOZ_ASSERT(
      gDBManager,
      Get(),
      "MaxSerializedMsgSize() called before indexedDB has been initialized!");
  MOZ_ASSERT(gMaxSerializedMsgSize > 0);

@@ -450,7 +471,7 @@ uint32_t IndexedDatabaseManager::MaxSerializedMsgSize() {

// static
int32_t IndexedDatabaseManager::MaxPreloadExtraRecords() {
  MOZ_ASSERT(gDBManager,
  MOZ_ASSERT(Get(),
             "MaxPreloadExtraRecords() called before indexedDB has been "
             "initialized!");