Commit 3da36b47 authored by Jens Stutte's avatar Jens Stutte Committed by Pier Angelo Vendrame
Browse files

Bug 2016901 - Fix potential race in NSSIOLayer. r=keeler

parent 76ecd5e0
Loading
Loading
Loading
Loading
+19 −2
Original line number Diff line number Diff line
@@ -979,10 +979,22 @@ void nsSSLIOLayerHelpers::GlobalCleanup() {
  MOZ_ASSERT(NS_IsMainThread(), "Not on main thread");

  if (gPrivateSSLIOLayerHelpers) {
    Preferences::RemoveObserver(gPrivateSSLIOLayerHelpers,
                                "security.tls.version.fallback-limit");
#ifdef DEBUG
    gPrivateSSLIOLayerHelpers->mRegisteredPrefObservers = false;
#endif
    gPrivateSSLIOLayerHelpers = nullptr;
  }

  if (gPublicSSLIOLayerHelpers) {
    Preferences::RemoveObserver(gPublicSSLIOLayerHelpers,
                                "security.tls.version.fallback-limit");
    Preferences::RemoveObserver(gPublicSSLIOLayerHelpers,
                                "security.tls.insecure_fallback_hosts");
#ifdef DEBUG
    gPublicSSLIOLayerHelpers->mRegisteredPrefObservers = false;
#endif
    gPublicSSLIOLayerHelpers = nullptr;
  }
}
@@ -1012,8 +1024,10 @@ static int32_t PlaintextRecv(PRFileDesc* fd, void* buf, int32_t amount,
}

nsSSLIOLayerHelpers::~nsSSLIOLayerHelpers() {
  Preferences::RemoveObserver(this, "security.tls.version.fallback-limit");
  Preferences::RemoveObserver(this, "security.tls.insecure_fallback_hosts");
  // Pref observers must have been removed before destruction, since the
  // destructor may run off the main thread.
  MOZ_ASSERT(!mRegisteredPrefObservers,
             "Pref observers should have been removed before destruction");
}

template <typename R, R return_value, typename... Args>
@@ -1094,6 +1108,9 @@ nsresult nsSSLIOLayerHelpers::Init() {
  if (NS_IsMainThread()) {
    initInsecureFallbackSites();

#ifdef DEBUG
    mRegisteredPrefObservers = true;
#endif
    Preferences::AddStrongObserver(this, "security.tls.version.fallback-limit");
    if (isPublic()) {
      // Changes to the allowlist on the public side will update the pref.
+3 −0
Original line number Diff line number Diff line
@@ -101,6 +101,9 @@ class nsSSLIOLayerHelpers : public nsIObserver {

  mozilla::Mutex mutex MOZ_UNANNOTATED;
  uint32_t mTlsFlags;
#ifdef DEBUG
  bool mRegisteredPrefObservers = false;
#endif
};

namespace {