From 7e84625365ca7831724da2f91ebd6bd44a36ad3f Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Fri, 18 Nov 2022 13:25:47 +0000 Subject: [PATCH] Bug 1774111 - Check for already-completed request in ModuleLoaderBase::FinishDynamicImport r=yulia I've looked at this for a while and still don't know how this can happen but it does seem reasonable to add a check here that we haven't already completed the request. Depends on D162386 Differential Revision: https://phabricator.services.mozilla.com/D162387 --- js/loader/ModuleLoaderBase.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/js/loader/ModuleLoaderBase.cpp b/js/loader/ModuleLoaderBase.cpp index c1939d3990ef..3e962d0be2a6 100644 --- a/js/loader/ModuleLoaderBase.cpp +++ b/js/loader/ModuleLoaderBase.cpp @@ -267,6 +267,9 @@ bool ModuleLoaderBase::HostPopulateImportMeta( bool ModuleLoaderBase::HostImportModuleDynamically( JSContext* aCx, JS::Handle aReferencingPrivate, JS::Handle aModuleRequest, JS::Handle aPromise) { + MOZ_DIAGNOSTIC_ASSERT(aModuleRequest); + MOZ_DIAGNOSTIC_ASSERT(aPromise); + RefPtr script(GetLoadedScriptOrNull(aCx, aReferencingPrivate)); JS::Rooted specifierString( @@ -945,6 +948,11 @@ void ModuleLoaderBase::FinishDynamicImport( // Complete the dynamic import, report failures indicated by aResult or as a // pending exception on the context. + if (!aRequest->mDynamicPromise) { + // Import has already been completed. + return; + } + if (NS_FAILED(aResult) && aResult != NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW_UNCATCHABLE) { MOZ_ASSERT(!JS_IsExceptionPending(aCx));