From 86c3568a230b31d06726c1dd7cd1e5309d1ce847 Mon Sep 17 00:00:00 2001 From: Luca Greco Date: Wed, 27 Oct 2021 16:36:34 +0000 Subject: [PATCH] Bug 1735899 - Make sure RemoteLazyInputStream::Close calls mInputStreamCallback OnInputStreamReady method. r=nika 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 | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/dom/file/ipc/RemoteLazyInputStream.cpp b/dom/file/ipc/RemoteLazyInputStream.cpp index 10e2e41633a..d49cee228e4 100644 --- a/dom/file/ipc/RemoteLazyInputStream.cpp +++ b/dom/file/ipc/RemoteLazyInputStream.cpp @@ -281,6 +281,10 @@ NS_IMETHODIMP RemoteLazyInputStream::Close() { nsCOMPtr asyncRemoteStream; nsCOMPtr remoteStream; + + nsCOMPtr inputStreamCallback; + nsCOMPtr 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); } -- 2.30.2