From b2cd254c35b6b1b128beea0eacdb8e814d91e003 Mon Sep 17 00:00:00 2001 From: Kenta Moriuchi Date: Thu, 4 Jan 2024 13:12:38 +0900 Subject: fix: strict type check for cross realms (#21669) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deno v1.39 introduces `vm.runInNewContext`. This may cause problems when using `Object.prototype.isPrototypeOf` to check built-in types. ```js import vm from "node:vm"; const err = new Error(); const crossErr = vm.runInNewContext(`new Error()`); console.assert( !(crossErr instanceof Error) ); console.assert( Object.getPrototypeOf(err) !== Object.getPrototypeOf(crossErr) ); ``` This PR changes to check using internal slots solves them. --- current: ``` > import vm from "node:vm"; undefined > vm.runInNewContext(`new Error("message")`) Error {} > vm.runInNewContext(`new Date("2018-12-10T02:26:59.002Z")`) Date {} ``` this PR: ``` > import vm from "node:vm"; undefined > vm.runInNewContext(`new Error("message")`) Error: message at :1:1 > vm.runInNewContext(`new Date("2018-12-10T02:26:59.002Z")`) 2018-12-10T02:26:59.002Z ``` --------- Co-authored-by: Bartek IwaƄczuk --- cli/tests/unit/console_test.ts | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) (limited to 'cli/tests/unit') diff --git a/cli/tests/unit/console_test.ts b/cli/tests/unit/console_test.ts index 7d4675976..031512f79 100644 --- a/cli/tests/unit/console_test.ts +++ b/cli/tests/unit/console_test.ts @@ -1845,18 +1845,36 @@ Deno.test(function consoleLogShouldNotThrowErrorWhenInvalidDateIsPassed() { // console.log(new Proxy(new Set(), {})) Deno.test(function consoleLogShouldNotThrowErrorWhenInputIsProxiedSet() { mockConsole((console, out) => { - const proxiedSet = new Proxy(new Set(), {}); + const proxiedSet = new Proxy(new Set([1, 2]), {}); console.log(proxiedSet); - assertEquals(stripColor(out.toString()), "Set {}\n"); + assertEquals(stripColor(out.toString()), "Set(2) { 1, 2 }\n"); }); }); // console.log(new Proxy(new Map(), {})) Deno.test(function consoleLogShouldNotThrowErrorWhenInputIsProxiedMap() { mockConsole((console, out) => { - const proxiedMap = new Proxy(new Map(), {}); + const proxiedMap = new Proxy(new Map([[1, 1], [2, 2]]), {}); console.log(proxiedMap); - assertEquals(stripColor(out.toString()), "Map {}\n"); + assertEquals(stripColor(out.toString()), "Map(2) { 1 => 1, 2 => 2 }\n"); + }); +}); + +// console.log(new Proxy(new Uint8Array(), {})) +Deno.test(function consoleLogShouldNotThrowErrorWhenInputIsProxiedTypedArray() { + mockConsole((console, out) => { + const proxiedUint8Array = new Proxy(new Uint8Array([1, 2]), {}); + console.log(proxiedUint8Array); + assertEquals(stripColor(out.toString()), "Uint8Array(2) [ 1, 2 ]\n"); + }); +}); + +// console.log(new Proxy(new RegExp(), {})) +Deno.test(function consoleLogShouldNotThrowErrorWhenInputIsProxiedRegExp() { + mockConsole((console, out) => { + const proxiedRegExp = new Proxy(/aaaa/, {}); + console.log(proxiedRegExp); + assertEquals(stripColor(out.toString()), "/aaaa/\n"); }); }); @@ -1869,6 +1887,15 @@ Deno.test(function consoleLogShouldNotThrowErrorWhenInputIsProxiedDate() { }); }); +// console.log(new Proxy(new Error(), {})) +Deno.test(function consoleLogShouldNotThrowErrorWhenInputIsProxiedError() { + mockConsole((console, out) => { + const proxiedError = new Proxy(new Error("message"), {}); + console.log(proxiedError); + assertStringIncludes(stripColor(out.toString()), "Error: message\n"); + }); +}); + // console.dir test Deno.test(function consoleDir() { mockConsole((console, out) => { -- cgit v1.2.3