Revert "src: don't overwrite non-writable vm globals"
This reverts commit 524f693872cf453af2655ec47356d25d52394e3d. Fixes: https://github.com/nodejs/node/issues/10806 Fixes: https://github.com/nodejs/node/issues/10492 Ref: https://github.com/nodejs/node/pull/10227 PR-URL: https://github.com/nodejs/node/pull/10920 Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
This commit is contained in:
parent
dd928b04fc
commit
3e851cf18b
@ -383,22 +383,19 @@ class ContextifyContext {
|
||||
if (ctx->context_.IsEmpty())
|
||||
return;
|
||||
|
||||
auto attributes = PropertyAttribute::None;
|
||||
bool is_declared =
|
||||
ctx->global_proxy()->GetRealNamedPropertyAttributes(ctx->context(),
|
||||
property)
|
||||
.To(&attributes);
|
||||
bool read_only =
|
||||
static_cast<int>(attributes) &
|
||||
static_cast<int>(PropertyAttribute::ReadOnly);
|
||||
ctx->global_proxy()->HasRealNamedProperty(ctx->context(),
|
||||
property).FromJust();
|
||||
bool is_contextual_store = ctx->global_proxy() != args.This();
|
||||
|
||||
if (is_declared && read_only)
|
||||
return;
|
||||
bool set_property_will_throw =
|
||||
args.ShouldThrowOnError() &&
|
||||
!is_declared &&
|
||||
is_contextual_store;
|
||||
|
||||
if (!is_declared && args.ShouldThrowOnError())
|
||||
return;
|
||||
|
||||
ctx->sandbox()->Set(property, value);
|
||||
if (!set_property_will_throw) {
|
||||
ctx->sandbox()->Set(property, value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -75,14 +75,3 @@ assert.throws(function() {
|
||||
// https://github.com/nodejs/node/issues/6158
|
||||
ctx = new Proxy({}, {});
|
||||
assert.strictEqual(typeof vm.runInNewContext('String', ctx), 'function');
|
||||
|
||||
// https://github.com/nodejs/node/issues/10223
|
||||
ctx = vm.createContext();
|
||||
vm.runInContext('Object.defineProperty(this, "x", { value: 42 })', ctx);
|
||||
assert.strictEqual(ctx.x, undefined); // Not copied out by cloneProperty().
|
||||
assert.strictEqual(vm.runInContext('x', ctx), 42);
|
||||
vm.runInContext('x = 0', ctx); // Does not throw but x...
|
||||
assert.strictEqual(vm.runInContext('x', ctx), 42); // ...should be unaltered.
|
||||
assert.throws(() => vm.runInContext('"use strict"; x = 0', ctx),
|
||||
/Cannot assign to read only property 'x'/);
|
||||
assert.strictEqual(vm.runInContext('x', ctx), 42);
|
||||
|
Loading…
x
Reference in New Issue
Block a user