diff --git a/netwerk/dns/nsDNSService2.cpp b/netwerk/dns/nsDNSService2.cpp index c919da3b5e42..55ce1cfae409 100644 --- a/netwerk/dns/nsDNSService2.cpp +++ b/netwerk/dns/nsDNSService2.cpp @@ -255,7 +255,11 @@ public: uint16_t af) : mResolver(res) , mHost(host) - , mListener(listener) + // Sometimes aListener is a main-thread only object like XPCWrappedJS, and + // sometimes it's a threadsafe object like nsSocketTransport. Use a main- + // thread pointer holder, but disable strict enforcement of thread invariants. + // The AddRef implementation of XPCWrappedJS will assert if we go wrong here. + , mListener(new nsMainThreadPtrHolder(listener, false)) , mFlags(flags) , mAF(af) {} ~nsDNSAsyncRequest() {} @@ -268,7 +272,7 @@ public: nsRefPtr mResolver; nsCString mHost; // hostname we're resolving - nsCOMPtr mListener; + nsMainThreadPtrHandle mListener; uint16_t mFlags; uint16_t mAF; }; @@ -292,7 +296,7 @@ nsDNSAsyncRequest::OnLookupComplete(nsHostResolver *resolver, MOZ_EVENT_TRACER_DONE(this, "net::dns::lookup"); mListener->OnLookupComplete(this, rec, status); - mListener = nullptr; + mListener = nsMainThreadPtrHandle(); // release the reference to ourselves that was added before we were // handed off to the host resolver.