diff --git a/bin/ch/Helpers.cpp b/bin/ch/Helpers.cpp index a09790a50e3..1e51d4ef50a 100644 --- a/bin/ch/Helpers.cpp +++ b/bin/ch/Helpers.cpp @@ -200,117 +200,129 @@ HRESULT Helpers::LoadScriptFromFile(LPCSTR filenameToLoad, LPCSTR& contents, UIN filename = combinedPathBuffer; } - // - // Open the file as a binary file to prevent CRT from handling encoding, line-break conversions, - // etc. - // - if (fopen_s(&file, filename, "rb") != 0) + // check if have it registered + AutoString *data; + if (SourceMap::Find(filenameToLoad, strlen(filenameToLoad), &data) || + SourceMap::Find(filename, strlen(filename), &data)) { - if (!HostConfigFlags::flags.MuteHostErrorMsgIsEnabled) + contents = data->GetString(); + if (lengthBytesOut != nullptr) { -#ifdef _WIN32 - DWORD lastError = GetLastError(); - char16 wszBuff[MAX_URI_LENGTH]; - fprintf(stderr, "Error in opening file '%s' ", filename); - wszBuff[0] = 0; - if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, - nullptr, - lastError, - 0, - wszBuff, - _countof(wszBuff), - nullptr)) - { - fwprintf(stderr, _u(": %s"), wszBuff); - } - fwprintf(stderr, _u("\n")); -#elif defined(_POSIX_VERSION) - fprintf(stderr, "Error in opening file: "); - perror(filename); -#endif + *lengthBytesOut = (UINT) data->GetLength(); } - - IfFailGo(E_FAIL); } - - if (file != NULL) + else { - // Determine the file length, in bytes. - fseek(file, 0, SEEK_END); - lengthBytes = ftell(file); - fseek(file, 0, SEEK_SET); - const size_t bufferLength = lengthBytes + sizeof(BYTE); - pRawBytes = (LPBYTE)malloc(bufferLength); - if (nullptr == pRawBytes) + // Open the file as a binary file to prevent CRT from handling encoding, line-break conversions, + // etc. + if (fopen_s(&file, filename, "rb") != 0) { - fwprintf(stderr, _u("out of memory")); - IfFailGo(E_OUTOFMEMORY); - } + if (!HostConfigFlags::flags.MuteHostErrorMsgIsEnabled) + { + #ifdef _WIN32 + DWORD lastError = GetLastError(); + char16 wszBuff[MAX_URI_LENGTH]; + fprintf(stderr, "Error in opening file '%s' ", filename); + wszBuff[0] = 0; + if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, + nullptr, + lastError, + 0, + wszBuff, + _countof(wszBuff), + nullptr)) + { + fwprintf(stderr, _u(": %s"), wszBuff); + } + fwprintf(stderr, _u("\n")); + #elif defined(_POSIX_VERSION) + fprintf(stderr, "Error in opening file: "); + perror(filename); + #endif + } - // - // Read the entire content as a binary block. - // - size_t readBytes = fread(pRawBytes, sizeof(BYTE), lengthBytes, file); - if (readBytes < lengthBytes * sizeof(BYTE)) - { IfFailGo(E_FAIL); } - pRawBytes[lengthBytes] = 0; // Null terminate it. Could be UTF16 - - // - // Read encoding to make sure it's supported - // - // Warning: The UNICODE buffer for parsing is supposed to be provided by the host. - // This is not a complete read of the encoding. Some encodings like UTF7, UTF1, EBCDIC, SCSU, BOCU could be - // wrongly classified as ANSI - // + if (file != NULL) { -#pragma warning(push) -// suppressing prefast warning that "readable size is bufferLength bytes but 2 may be read" as bufferLength is clearly > 2 in the code that follows -#pragma warning(disable:6385) - C_ASSERT(sizeof(WCHAR) == 2); - if (bufferLength > 2) + // Determine the file length, in bytes. + fseek(file, 0, SEEK_END); + lengthBytes = ftell(file); + fseek(file, 0, SEEK_SET); + const size_t bufferLength = lengthBytes + sizeof(BYTE); + pRawBytes = (LPBYTE)malloc(bufferLength); + if (nullptr == pRawBytes) { - __analysis_assume(bufferLength > 2); -#pragma prefast(push) -#pragma prefast(disable:6385, "PREfast incorrectly reports this as an out-of-bound access."); - if ((pRawBytes[0] == 0xFE && pRawBytes[1] == 0xFF) || - (pRawBytes[0] == 0xFF && pRawBytes[1] == 0xFE) || - (bufferLength > 4 && pRawBytes[0] == 0x00 && pRawBytes[1] == 0x00 && - ((pRawBytes[2] == 0xFE && pRawBytes[3] == 0xFF) || - (pRawBytes[2] == 0xFF && pRawBytes[3] == 0xFE)))) + fwprintf(stderr, _u("out of memory")); + IfFailGo(E_OUTOFMEMORY); + } + // + // Read the entire content as a binary block. + // + size_t readBytes = fread(pRawBytes, sizeof(BYTE), lengthBytes, file); + if (readBytes < lengthBytes * sizeof(BYTE)) + { + IfFailGo(E_FAIL); + } + + pRawBytes[lengthBytes] = 0; // Null terminate it. Could be UTF16 + + // + // Read encoding to make sure it's supported + // + // Warning: The UNICODE buffer for parsing is supposed to be provided by the host. + // This is not a complete read of the encoding. Some encodings like UTF7, UTF1, EBCDIC, SCSU, BOCU could be + // wrongly classified as ANSI + // + { + #pragma warning(push) + // suppressing prefast warning that "readable size is bufferLength bytes but 2 may be read" as bufferLength is clearly > 2 in the code that follows + #pragma warning(disable:6385) + C_ASSERT(sizeof(WCHAR) == 2); + if (bufferLength > 2) { - // unicode unsupported - fwprintf(stderr, _u("unsupported file encoding. Only ANSI and UTF8 supported")); - IfFailGo(E_UNEXPECTED); + __analysis_assume(bufferLength > 2); + #pragma prefast(push) + #pragma prefast(disable:6385, "PREfast incorrectly reports this as an out-of-bound access."); + if ((pRawBytes[0] == 0xFE && pRawBytes[1] == 0xFF) || + (pRawBytes[0] == 0xFF && pRawBytes[1] == 0xFE) || + (bufferLength > 4 && pRawBytes[0] == 0x00 && pRawBytes[1] == 0x00 && + ((pRawBytes[2] == 0xFE && pRawBytes[3] == 0xFF) || + (pRawBytes[2] == 0xFF && pRawBytes[3] == 0xFE)))) + + { + // unicode unsupported + fwprintf(stderr, _u("unsupported file encoding. Only ANSI and UTF8 supported")); + IfFailGo(E_UNEXPECTED); + } + #pragma prefast(pop) } -#pragma prefast(pop) } + #pragma warning(pop) } -#pragma warning(pop) - } - contents = reinterpret_cast(pRawBytes); + contents = reinterpret_cast(pRawBytes); -Error: - if (SUCCEEDED(hr)) - { - if (lengthBytesOut) + Error: + if (SUCCEEDED(hr)) { - *lengthBytesOut = lengthBytes; + if (lengthBytesOut) + { + *lengthBytesOut = lengthBytes; + } } - } - if (file != NULL) - { - fclose(file); - } + if (file != NULL) + { + fclose(file); + } - if (pRawBytes && reinterpret_cast(pRawBytes) != contents) - { - free(pRawBytes); + if (pRawBytes && reinterpret_cast(pRawBytes) != contents) + { + free(pRawBytes); + } } return hr; diff --git a/bin/ch/stdafx.h b/bin/ch/stdafx.h index 58532654ce3..f5578086692 100644 --- a/bin/ch/stdafx.h +++ b/bin/ch/stdafx.h @@ -316,11 +316,16 @@ class SourceMap } static bool Find(AutoString &path, AutoString ** out) + { + return Find(path.GetString(), path.GetLength(), out); + } + + static bool Find(LPCSTR path, size_t pathLength, AutoString ** out) { FileNode * node = root; while(node != nullptr) { - if (strncmp(node->path.GetString(), path.GetString(), path.GetLength()) == 0) + if (strncmp(node->path.GetString(), path, pathLength) == 0) { *out = &(node->data); return true; diff --git a/test/es6/bug_issue_3257.js b/test/es6/bug_issue_3257.js deleted file mode 100644 index cdd670bb34b..00000000000 --- a/test/es6/bug_issue_3257.js +++ /dev/null @@ -1,7 +0,0 @@ -//------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. -//------------------------------------------------------------------------------------------------------- - -WScript.LoadScriptFile("bug_issue_3257_mod/mod0.js", "module"); -WScript.LoadScriptFile("bug_issue_3257_script/script0.js"); diff --git a/test/es6/bug_issue_3257_mod/mod0.js b/test/es6/bug_issue_3257_mod/mod0.js deleted file mode 100644 index 95465b52f31..00000000000 --- a/test/es6/bug_issue_3257_mod/mod0.js +++ /dev/null @@ -1,9 +0,0 @@ -//------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. -//------------------------------------------------------------------------------------------------------- - -import 'bug_issue_3257_mod1.js'; -import 'bug_issue_3257_mod2/mod2.js'; - -console.log("mod0"); diff --git a/test/es6/bug_issue_3257_mod1.js b/test/es6/bug_issue_3257_mod1.js deleted file mode 100644 index a505bf58fc8..00000000000 --- a/test/es6/bug_issue_3257_mod1.js +++ /dev/null @@ -1,7 +0,0 @@ -//------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. -//------------------------------------------------------------------------------------------------------- - -import './bug_issue_3257_mod2/mod2.js'; -console.log("mod1"); diff --git a/test/es6/bug_issue_3257_mod2/mod2.js b/test/es6/bug_issue_3257_mod2/mod2.js deleted file mode 100644 index 87a0951eb28..00000000000 --- a/test/es6/bug_issue_3257_mod2/mod2.js +++ /dev/null @@ -1,7 +0,0 @@ -//------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. -//------------------------------------------------------------------------------------------------------- - -import 'bug_issue_3257_mod/mod0.js'; -console.log("mod2"); diff --git a/test/es6/bug_issue_3257_script/script0.js b/test/es6/bug_issue_3257_script/script0.js deleted file mode 100644 index f14d0e49dbf..00000000000 --- a/test/es6/bug_issue_3257_script/script0.js +++ /dev/null @@ -1,8 +0,0 @@ -//------------------------------------------------------------------------------------------------------- -// Copyright (C) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. -//------------------------------------------------------------------------------------------------------- - -console.log("script0"); -import('bug_issue_3257_mod1.js'); -import('bug_issue_3257_mod2/mod2.js'); diff --git a/test/es6/rlexe.xml b/test/es6/rlexe.xml index 3b05dd466ff..2f48ec58cdb 100644 --- a/test/es6/rlexe.xml +++ b/test/es6/rlexe.xml @@ -1367,16 +1367,6 @@ BugFix,exclude_sanitize_address - typedarray_bugs.js diff --git a/test/es6/bug_issue_3257.baseline b/test/es6module/bug_issue_3257.baseline similarity index 100% rename from test/es6/bug_issue_3257.baseline rename to test/es6module/bug_issue_3257.baseline diff --git a/test/es6module/bug_issue_3257.js b/test/es6module/bug_issue_3257.js new file mode 100644 index 00000000000..c66d184db8a --- /dev/null +++ b/test/es6module/bug_issue_3257.js @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +WScript.RegisterModuleSource("mod0.js", ` + import 'mod1.js'; + import 'mod2.js'; + + console.log("mod0"); +`); + +WScript.RegisterModuleSource("mod1.js",` + import 'mod2.js'; + console.log("mod1"); +`); + +WScript.RegisterModuleSource("mod2.js",` + import 'mod0.js'; + console.log("mod2"); +`); + +WScript.RegisterModuleSource("script0.js",` + console.log("script0"); + import('mod1.js'); + import('mod2.js'); +`); + +WScript.LoadScriptFile("mod0.js", "module"); +WScript.LoadScriptFile("script0.js"); diff --git a/test/es6module/rlexe.xml b/test/es6module/rlexe.xml index 98802e27a3b..281298358f4 100644 --- a/test/es6module/rlexe.xml +++ b/test/es6module/rlexe.xml @@ -126,4 +126,12 @@ BugFix,exclude_sanitize_address + + + bug_issue_3257.js + -ESDynamicImport + bug_issue_3257.baseline + BugFix,exclude_sanitize_address + +