Verified Commit 8ba19e29 authored by Randell Jesup's avatar Randell Jesup Committed by ma1
Browse files

Bug 2036666: Fix UrlClassifierFeatureBase mTables/mHosts a=dmeehan

parent 9e079476
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -18,13 +18,14 @@ namespace net {

namespace {

void OnPrefsChange(const char* aPrefName, void* aArray) {
  auto* array = static_cast<nsTArray<nsCString>*>(aArray);
  MOZ_ASSERT(array);
void OnPrefsChange(const char* aPrefName, void* aData) {
  auto* data = static_cast<UrlClassifierFeatureBase::PrefCallbackData*>(aData);
  MOZ_ASSERT(data && data->mArray);

  nsAutoCString value;
  Preferences::GetCString(aPrefName, value);
  Classifier::SplitTables(value, *array);
  MutexAutoLock lock(*data->mMutex);
  Classifier::SplitTables(value, *data->mArray);
}

}  // namespace
@@ -68,13 +69,15 @@ UrlClassifierFeatureBase::~UrlClassifierFeatureBase() = default;
void UrlClassifierFeatureBase::InitializePreferences() {
  for (uint32_t i = 0; i < 2; ++i) {
    if (!mPrefTables[i].IsEmpty()) {
      mTablesCbData[i] = {&mDataMutex, &mTables[i]};
      Preferences::RegisterCallbackAndCall(OnPrefsChange, mPrefTables[i],
                                           &mTables[i]);
                                           &mTablesCbData[i]);
    }

    if (!mPrefHosts[i].IsEmpty()) {
      mHostsCbData[i] = {&mDataMutex, &mHosts[i]};
      Preferences::RegisterCallbackAndCall(OnPrefsChange, mPrefHosts[i],
                                           &mHosts[i]);
                                           &mHostsCbData[i]);
    }
  }

@@ -92,11 +95,12 @@ void UrlClassifierFeatureBase::ShutdownPreferences() {
  for (uint32_t i = 0; i < 2; ++i) {
    if (!mPrefTables[i].IsEmpty()) {
      Preferences::UnregisterCallback(OnPrefsChange, mPrefTables[i],
                                      &mTables[i]);
                                      &mTablesCbData[i]);
    }

    if (!mPrefHosts[i].IsEmpty()) {
      Preferences::UnregisterCallback(OnPrefsChange, mPrefHosts[i], &mHosts[i]);
      Preferences::UnregisterCallback(OnPrefsChange, mPrefHosts[i],
                                      &mHostsCbData[i]);
    }
  }

@@ -129,6 +133,7 @@ UrlClassifierFeatureBase::GetTables(nsIUrlClassifierFeature::listType aListType,
    return NS_ERROR_INVALID_ARG;
  }

  MutexAutoLock lock(mDataMutex);
  aTables = mTables[aListType].Clone();
  return NS_OK;
}
@@ -144,6 +149,7 @@ UrlClassifierFeatureBase::HasTable(const nsACString& aTable,
    return NS_ERROR_INVALID_ARG;
  }

  MutexAutoLock lock(mDataMutex);
  *aResult = mTables[aListType].Contains(aTable);
  return NS_OK;
}
@@ -159,6 +165,7 @@ UrlClassifierFeatureBase::HasHostInPreferences(
    return NS_ERROR_INVALID_ARG;
  }

  MutexAutoLock lock(mDataMutex);
  *aResult = mHosts[aListType].Contains(aHost);
  if (*aResult) {
    aPrefTableName = mPrefTableNames[aListType];
+13 −2
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include "nsIUrlClassifierFeature.h"
#include "nsIUrlClassifierExceptionListService.h"
#include "nsIUrlClassifierExceptionList.h"
#include "mozilla/Mutex.h"
#include "nsCOMPtr.h"
#include "nsTArray.h"
#include "nsString.h"
@@ -61,16 +62,26 @@ class UrlClassifierFeatureBase : public nsIUrlClassifierFeature,

  nsCString mName;

 public:
  struct PrefCallbackData {
    mozilla::Mutex* mMutex;
    nsTArray<nsCString>* mArray;
  };

 private:
  nsCString mPrefExceptionHosts;

  mozilla::Mutex mDataMutex{"UrlClassifierFeatureBase::mDataMutex"};

  // 2: blocklist and entitylist.
  nsCString mPrefTables[2];
  nsTArray<nsCString> mTables[2];
  nsTArray<nsCString> mTables[2] MOZ_GUARDED_BY(mDataMutex);
  PrefCallbackData mTablesCbData[2];

  nsCString mPrefHosts[2];
  nsCString mPrefTableNames[2];
  nsTArray<nsCString> mHosts[2];
  nsTArray<nsCString> mHosts[2] MOZ_GUARDED_BY(mDataMutex);
  PrefCallbackData mHostsCbData[2];

  nsCOMPtr<nsIUrlClassifierExceptionList> mExceptionList;
};