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

Bug 2036932: Fix nsSocketTransport2 DNS result field data races r=necko-reviewers,valentin

parent 65dfa380
Loading
Loading
Loading
Loading
+38 −12
Original line number Diff line number Diff line
@@ -728,9 +728,15 @@ nsresult nsSocketTransport::Init(const nsTArray<nsCString>& types,
  if (dnsRecord) {
    mExternalDNSResolution = true;
    mDNSRecord = do_QueryInterface(dnsRecord);
    mDNSRecord->IsTRR(&mResolvedByTRR);
    mDNSRecord->GetEffectiveTRRMode(&mEffectiveTRRMode);
    mDNSRecord->GetTrrSkipReason(&mTRRSkipReason);
    bool resolvedByTRR;
    mDNSRecord->IsTRR(&resolvedByTRR);
    mResolvedByTRR = resolvedByTRR;
    nsIRequest::TRRMode effectiveTRRMode;
    mDNSRecord->GetEffectiveTRRMode(&effectiveTRRMode);
    mEffectiveTRRMode = effectiveTRRMode;
    nsITRRSkipReason::value trrSkipReason;
    mDNSRecord->GetTrrSkipReason(&trrSkipReason);
    mTRRSkipReason = trrSkipReason;
  }

  // init socket type info
@@ -1757,9 +1763,17 @@ bool nsSocketTransport::RecoverFromError() {
  // try next ip address only if past the resolver stage...
  if (mState == STATE_CONNECTING && mDNSRecord) {
    nsresult rv = mDNSRecord->GetNextAddr(SocketPort(), &mNetAddr);
    mDNSRecord->IsTRR(&mResolvedByTRR);
    mDNSRecord->GetEffectiveTRRMode(&mEffectiveTRRMode);
    mDNSRecord->GetTrrSkipReason(&mTRRSkipReason);
    {
      bool resolvedByTRR;
      mDNSRecord->IsTRR(&resolvedByTRR);
      mResolvedByTRR = resolvedByTRR;
      nsIRequest::TRRMode effectiveTRRMode;
      mDNSRecord->GetEffectiveTRRMode(&effectiveTRRMode);
      mEffectiveTRRMode = effectiveTRRMode;
      nsITRRSkipReason::value trrSkipReason;
      mDNSRecord->GetTrrSkipReason(&trrSkipReason);
      mTRRSkipReason = trrSkipReason;
    }
    if (NS_SUCCEEDED(rv)) {
      SOCKET_LOG(("  trying again with next ip address\n"));
      tryAgain = true;
@@ -2067,9 +2081,15 @@ void nsSocketTransport::OnSocketEvent(uint32_t type, nsresult status,

      if (mDNSRecord) {
        mDNSRecord->GetNextAddr(SocketPort(), &mNetAddr);
        mDNSRecord->IsTRR(&mResolvedByTRR);
        mDNSRecord->GetEffectiveTRRMode(&mEffectiveTRRMode);
        mDNSRecord->GetTrrSkipReason(&mTRRSkipReason);
        bool resolvedByTRR;
        mDNSRecord->IsTRR(&resolvedByTRR);
        mResolvedByTRR = resolvedByTRR;
        nsIRequest::TRRMode effectiveTRRMode;
        mDNSRecord->GetEffectiveTRRMode(&effectiveTRRMode);
        mEffectiveTRRMode = effectiveTRRMode;
        nsITRRSkipReason::value trrSkipReason;
        mDNSRecord->GetTrrSkipReason(&trrSkipReason);
        mTRRSkipReason = trrSkipReason;
      }
      // status contains DNS lookup status
      if (NS_FAILED(status)) {
@@ -2829,9 +2849,15 @@ nsSocketTransport::OnLookupComplete(nsICancelable* request, nsIDNSRecord* rec,
  }

  if (nsCOMPtr<nsIDNSAddrRecord> addrRecord = do_QueryInterface(rec)) {
    addrRecord->IsTRR(&mResolvedByTRR);
    addrRecord->GetEffectiveTRRMode(&mEffectiveTRRMode);
    addrRecord->GetTrrSkipReason(&mTRRSkipReason);
    bool resolvedByTRR;
    addrRecord->IsTRR(&resolvedByTRR);
    mResolvedByTRR = resolvedByTRR;
    nsIRequest::TRRMode effectiveTRRMode;
    addrRecord->GetEffectiveTRRMode(&effectiveTRRMode);
    mEffectiveTRRMode = effectiveTRRMode;
    nsITRRSkipReason::value trrSkipReason;
    addrRecord->GetTrrSkipReason(&trrSkipReason);
    mTRRSkipReason = trrSkipReason;
  }

  // flag host lookup complete for the benefit of the ResolveHost method.
+5 −3
Original line number Diff line number Diff line
@@ -273,9 +273,11 @@ class nsSocketTransport final : public nsASocketHandler,

  nsCString mEchConfig MOZ_GUARDED_BY(mLock);
  Atomic<bool, Relaxed> mEchConfigUsed{false};
  bool mResolvedByTRR{false};
  nsIRequest::TRRMode mEffectiveTRRMode{nsIRequest::TRR_DEFAULT_MODE};
  nsITRRSkipReason::value mTRRSkipReason{nsITRRSkipReason::TRR_UNSET};
  Atomic<bool, Relaxed> mResolvedByTRR{false};
  Atomic<nsIRequest::TRRMode, Relaxed> mEffectiveTRRMode{
      nsIRequest::TRR_DEFAULT_MODE};
  Atomic<nsITRRSkipReason::value, Relaxed> mTRRSkipReason{
      nsITRRSkipReason::TRR_UNSET};

  nsCOMPtr<nsISupports> mInputCopyContext;
  nsCOMPtr<nsISupports> mOutputCopyContext;