fix(ext/timers): create primordial eval (#15110)

This commit is contained in:
Garcia 2022-09-02 08:55:44 -07:00 committed by GitHub
parent 03e6727a04
commit 4ec213b0aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 3 deletions

View File

@ -84,6 +84,27 @@ Deno.test(async function timeoutEvalNoScopeLeak() {
Reflect.deleteProperty(global, "globalPromise");
});
Deno.test(async function evalPrimordial() {
const global = globalThis as unknown as {
globalPromise: ReturnType<typeof deferred>;
};
global.globalPromise = deferred();
const originalEval = globalThis.eval;
let wasCalled = false;
globalThis.eval = (argument) => {
wasCalled = true;
return originalEval(argument);
};
setTimeout(
"globalThis.globalPromise.resolve();" as unknown as () => void,
0,
);
await global.globalPromise;
assert(!wasCalled);
Reflect.deleteProperty(global, "globalPromise");
globalThis.eval = originalEval;
});
Deno.test(async function timeoutArgs() {
const promise = deferred();
const arg = 1;

View File

@ -468,6 +468,11 @@
queueMicrotask = value;
};
// Renaming from `eval` is necessary because otherwise it would perform direct
// evaluation, allowing user-land access to local variables.
// This is because the identifier `eval` is somewhat treated as a keyword
primordials.indirectEval = eval;
ObjectSetPrototypeOf(primordials, null);
ObjectFreeze(primordials);

View File

@ -21,6 +21,7 @@
SafeArrayIterator,
SymbolFor,
TypeError,
indirectEval,
} = window.__bootstrap.primordials;
const { webidl } = window.__bootstrap;
const { reportException } = window.__bootstrap.event;
@ -155,9 +156,7 @@
reportException(error);
}
} else {
// TODO(@andreubotella): eval doesn't seem to have a primordial, but
// it can be redefined in the global scope.
(0, eval)(callback);
indirectEval(callback);
}
if (repeat) {