forked from mirrors/gecko-dev
		
	Bug 1938471 - synchronize access to FetchDriver::mObserver. r=necko-reviewers,kershaw, a=dmeehan
Differential Revision: https://phabricator.services.mozilla.com/D235762
This commit is contained in:
		
							parent
							
								
									f05fe128f1
								
							
						
					
					
						commit
						90e6ebd641
					
				
					 2 changed files with 26 additions and 6 deletions
				
			
		|  | @ -342,6 +342,7 @@ FetchDriver::FetchDriver(SafeRefPtr<InternalRequest> aRequest, | |||
|     : mPrincipal(aPrincipal), | ||||
|       mLoadGroup(aLoadGroup), | ||||
|       mRequest(std::move(aRequest)), | ||||
|       mODAMutex("FetchDriver::mODAMutex"), | ||||
|       mMainThreadEventTarget(aMainThreadEventTarget), | ||||
|       mCookieJarSettings(aCookieJarSettings), | ||||
|       mPerformanceStorage(aPerformanceStorage), | ||||
|  | @ -1384,7 +1385,10 @@ FetchDriver::OnDataAvailable(nsIRequest* aRequest, nsIInputStream* aInputStream, | |||
|                              uint64_t aOffset, uint32_t aCount) { | ||||
|   // NB: This can be called on any thread!  But we're guaranteed that it is
 | ||||
|   // called between OnStartRequest and OnStopRequest, so we don't need to worry
 | ||||
|   // about races.
 | ||||
|   // about races for the members accessed in OnStartRequest, OnStopRequest,
 | ||||
|   // FailWithNetworkError and member functions accessed before opening the
 | ||||
|   // channel. However, we have a possibility of a race from
 | ||||
|   // FetchDriverAbortActions
 | ||||
| 
 | ||||
|   if (!mPipeOutputStream) { | ||||
|     // We ignore the body for HEAD/CONNECT requests.
 | ||||
|  | @ -1398,9 +1402,13 @@ FetchDriver::OnDataAvailable(nsIRequest* aRequest, nsIInputStream* aInputStream, | |||
| 
 | ||||
|   if (mNeedToObserveOnDataAvailable) { | ||||
|     mNeedToObserveOnDataAvailable = false; | ||||
|     if (mObserver) { | ||||
|     RefPtr<FetchDriverObserver> observer; | ||||
|     { | ||||
|       MutexAutoLock lock(mODAMutex); | ||||
|       // Need to keep mObserver alive.
 | ||||
|       RefPtr<FetchDriverObserver> observer = mObserver; | ||||
|       observer = mObserver; | ||||
|     } | ||||
|     if (observer) { | ||||
|       if (NS_IsMainThread()) { | ||||
|         observer->OnDataAvailable(); | ||||
|       } else { | ||||
|  | @ -1796,8 +1804,13 @@ void FetchDriver::RunAbortAlgorithm() { FetchDriverAbortActions(Signal()); } | |||
| 
 | ||||
| void FetchDriver::FetchDriverAbortActions(AbortSignalImpl* aSignalImpl) { | ||||
|   MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread()); | ||||
|   RefPtr<FetchDriverObserver> observer; | ||||
|   { | ||||
|     MutexAutoLock lock(mODAMutex); | ||||
|     observer = std::move(mObserver); | ||||
|   } | ||||
| 
 | ||||
|   if (mObserver) { | ||||
|   if (observer) { | ||||
| #ifdef DEBUG | ||||
|     mResponseAvailableCalled = true; | ||||
| #endif | ||||
|  | @ -1805,8 +1818,7 @@ void FetchDriver::FetchDriverAbortActions(AbortSignalImpl* aSignalImpl) { | |||
|     if (aSignalImpl) { | ||||
|       reason.set(aSignalImpl->RawReason()); | ||||
|     } | ||||
|     mObserver->OnResponseEnd(FetchDriverObserver::eAborted, reason); | ||||
|     mObserver = nullptr; | ||||
|     observer->OnResponseEnd(FetchDriverObserver::eAborted, reason); | ||||
|   } | ||||
| 
 | ||||
|   if (mChannel) { | ||||
|  |  | |||
|  | @ -18,6 +18,7 @@ | |||
| #include "mozilla/dom/SerializedStackHolder.h" | ||||
| #include "mozilla/dom/SRIMetadata.h" | ||||
| #include "mozilla/RefPtr.h" | ||||
| #include "mozilla/Mutex.h" | ||||
| #include "mozilla/UniquePtr.h" | ||||
| 
 | ||||
| #include "mozilla/DebugOnly.h" | ||||
|  | @ -155,6 +156,13 @@ class FetchDriver final : public nsIChannelEventSink, | |||
|   SafeRefPtr<InternalRequest> mRequest; | ||||
|   SafeRefPtr<InternalResponse> mResponse; | ||||
|   nsCOMPtr<nsIOutputStream> mPipeOutputStream; | ||||
| 
 | ||||
|   // mutex to prevent race between OnDataAvailable (OMT) and main thread
 | ||||
|   // functions
 | ||||
|   Mutex mODAMutex; | ||||
|   // access to mObserver can race between FetchDriverAbortActions (main thread)
 | ||||
|   // and OnDataAvailable (OMT)
 | ||||
|   // See Bug 1810805
 | ||||
|   RefPtr<FetchDriverObserver> mObserver; | ||||
|   RefPtr<Document> mDocument; | ||||
|   nsCOMPtr<nsICSPEventListener> mCSPEventListener; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 smayya
						smayya