From 682026b6077320b0d079f96595b751bd757c8229 Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 16 May 2024 23:11:15 +0100 Subject: [PATCH] Module api bugs (#6992) * Check for errored module before getting Namespace * Check for missing fetchImportedModuleFromScriptCallback --- lib/Jsrt/Core/JsrtContextCore.cpp | 34 ++++++++++++++++--------------- lib/Jsrt/Core/JsrtContextCore.h | 3 +-- lib/Jsrt/Core/JsrtCore.cpp | 6 +++++- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/lib/Jsrt/Core/JsrtContextCore.cpp b/lib/Jsrt/Core/JsrtContextCore.cpp index 59fffac697a..7f82d1f7fb2 100644 --- a/lib/Jsrt/Core/JsrtContextCore.cpp +++ b/lib/Jsrt/Core/JsrtContextCore.cpp @@ -1,5 +1,6 @@ //------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. +// Copyright (c) ChakraCore Project Contributors. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "Runtime.h" @@ -105,26 +106,27 @@ void JsrtContextCore::OnScriptLoad(Js::JavascriptFunction * scriptFunction, Js:: HRESULT ChakraCoreHostScriptContext::FetchImportedModule(Js::ModuleRecordBase* referencingModule, LPCOLESTR specifier, Js::ModuleRecordBase** dependentModuleRecord) { - return FetchImportedModuleHelper( - [=](Js::JavascriptString *specifierVar, JsModuleRecord *dependentRecord) -> JsErrorCode + if (fetchImportedModuleCallback == nullptr) + { + return E_INVALIDARG; + } + Js::JavascriptString* specifierVar = Js::JavascriptString::NewCopySz(specifier, GetScriptContext()); + JsModuleRecord dependentRecord = JS_INVALID_REFERENCE; + { + AUTO_NO_EXCEPTION_REGION; + JsErrorCode errorCode = fetchImportedModuleCallback(referencingModule, specifierVar, &dependentRecord); + if (errorCode == JsNoError) { - return fetchImportedModuleCallback(referencingModule, specifierVar, dependentRecord); - }, specifier, dependentModuleRecord); + *dependentModuleRecord = static_cast(dependentRecord); + return NOERROR; + } + } + return E_INVALIDARG; } HRESULT ChakraCoreHostScriptContext::FetchImportedModuleFromScript(JsSourceContext dwReferencingSourceContext, LPCOLESTR specifier, Js::ModuleRecordBase** dependentModuleRecord) { - return FetchImportedModuleHelper( - [=](Js::JavascriptString *specifierVar, JsModuleRecord *dependentRecord) -> JsErrorCode - { - return fetchImportedModuleFromScriptCallback(dwReferencingSourceContext, specifierVar, dependentRecord); - }, specifier, dependentModuleRecord); -} - -template -HRESULT ChakraCoreHostScriptContext::FetchImportedModuleHelper(Fn fetch, LPCOLESTR specifier, Js::ModuleRecordBase** dependentModuleRecord) -{ - if (fetchImportedModuleCallback == nullptr) + if (fetchImportedModuleFromScriptCallback == nullptr) { return E_INVALIDARG; } @@ -132,7 +134,7 @@ HRESULT ChakraCoreHostScriptContext::FetchImportedModuleHelper(Fn fetch, LPCOLES JsModuleRecord dependentRecord = JS_INVALID_REFERENCE; { AUTO_NO_EXCEPTION_REGION; - JsErrorCode errorCode = fetch(specifierVar, &dependentRecord); + JsErrorCode errorCode = fetchImportedModuleFromScriptCallback(dwReferencingSourceContext, specifierVar, &dependentRecord); if (errorCode == JsNoError) { *dependentModuleRecord = static_cast(dependentRecord); diff --git a/lib/Jsrt/Core/JsrtContextCore.h b/lib/Jsrt/Core/JsrtContextCore.h index 81bf892df0c..ed7b7396f5e 100644 --- a/lib/Jsrt/Core/JsrtContextCore.h +++ b/lib/Jsrt/Core/JsrtContextCore.h @@ -1,5 +1,6 @@ //------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. +// Copyright (c) ChakraCore Project Contributors. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #pragma once @@ -266,8 +267,6 @@ class ChakraCoreHostScriptContext sealed : public HostScriptContext #endif private: - template - HRESULT FetchImportedModuleHelper(Fn fetch, LPCOLESTR specifier, Js::ModuleRecordBase** dependentModuleRecord); FetchImportedModuleCallBack fetchImportedModuleCallback; FetchImportedModuleFromScriptCallBack fetchImportedModuleFromScriptCallback; NotifyModuleReadyCallback notifyModuleReadyCallback; diff --git a/lib/Jsrt/Core/JsrtCore.cpp b/lib/Jsrt/Core/JsrtCore.cpp index c55713d5b0c..c0400ac6bda 100644 --- a/lib/Jsrt/Core/JsrtCore.cpp +++ b/lib/Jsrt/Core/JsrtCore.cpp @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. -// Copyright (c) 2021 ChakraCore Project Contributors. All rights reserved. +// Copyright (c) ChakraCore Project Contributors. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "JsrtPch.h" @@ -268,6 +268,10 @@ CHAKRA_API JsGetModuleNamespace(_In_ JsModuleRecord requestModule, _Outptr_resul { return JsErrorModuleNotEvaluated; } + if (moduleRecord->GetErrorObject() != nullptr) + { + return JsErrorInvalidArgument; + } *moduleNamespace = static_cast(moduleRecord->GetNamespace()); return JsNoError; }