Bug 1735899 - Make sure RemoteLazyInputStream::Close calls mInputStreamCallback OnInp...
authorLuca Greco <lgreco@mozilla.com>
Wed, 27 Oct 2021 16:36:34 +0000 (16:36 +0000)
committerMike Hommey <glandium@debian.org>
Tue, 8 Feb 2022 22:37:27 +0000 (22:37 +0000)
RemoteLazyInputStream::Close was not setting mInputStreamCallback to a nullptr without using it in the
InputStreamCallbackRunnable::Execute, which would be calling OnInputStreamReady on the mInputStreamCallback.

This does also match the details we gathered while investigating the bug (which was triggered exactly by a remote
lazy stream getter that did never got to call OnInputStreamReady by the time we were closing the channel).

Differential Revision: https://phabricator.services.mozilla.com/D129374

Gbp-Pq: Topic fixes
Gbp-Pq: Name Bug-1735899-Make-sure-RemoteLazyInputStream-Close-ca.patch

dom/file/ipc/RemoteLazyInputStream.cpp

index 10e2e41633ad7d859e17a5fec027f119e1f7fa4d..d49cee228e457c3229e1b97201137b746a4b5471 100644 (file)
@@ -281,6 +281,10 @@ NS_IMETHODIMP
 RemoteLazyInputStream::Close() {
   nsCOMPtr<nsIAsyncInputStream> asyncRemoteStream;
   nsCOMPtr<nsIInputStream> remoteStream;
+
+  nsCOMPtr<nsIInputStreamCallback> inputStreamCallback;
+  nsCOMPtr<nsIEventTarget> inputStreamCallbackEventTarget;
+
   {
     MutexAutoLock lock(mMutex);
 
@@ -292,15 +296,22 @@ RemoteLazyInputStream::Close() {
     asyncRemoteStream.swap(mAsyncRemoteStream);
     remoteStream.swap(mRemoteStream);
 
-    mInputStreamCallback = nullptr;
-    mInputStreamCallbackEventTarget = nullptr;
-
+    // TODO(Bug 1737783): Notify to the mFileMetadataCallback that this
+    // lazy input stream has been closed.
     mFileMetadataCallback = nullptr;
     mFileMetadataCallbackEventTarget = nullptr;
 
+    inputStreamCallback = std::move(mInputStreamCallback);
+    inputStreamCallbackEventTarget = std::move(mInputStreamCallbackEventTarget);
+
     mState = eClosed;
   }
 
+  if (inputStreamCallback) {
+    InputStreamCallbackRunnable::Execute(inputStreamCallback,
+                                         inputStreamCallbackEventTarget, this);
+  }
+
   if (asyncRemoteStream) {
     asyncRemoteStream->CloseWithStatus(NS_BASE_STREAM_CLOSED);
   }