Browse Source

Revert "src: don't overwrite non-writable vm globals"

This reverts commit 524f693872.

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>
v6
Anna Henningsen 8 years ago
parent
commit
3e851cf18b
No known key found for this signature in database GPG Key ID: D8B9F5AEAE84E4CF
  1. 23
      src/node_contextify.cc
  2. 11
      test/parallel/test-vm-context.js

23
src/node_contextify.cc

@ -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);
if (is_declared && read_only)
return;
ctx->global_proxy()->HasRealNamedProperty(ctx->context(),
property).FromJust();
bool is_contextual_store = ctx->global_proxy() != args.This();
if (!is_declared && args.ShouldThrowOnError())
return;
bool set_property_will_throw =
args.ShouldThrowOnError() &&
!is_declared &&
is_contextual_store;
ctx->sandbox()->Set(property, value);
if (!set_property_will_throw) {
ctx->sandbox()->Set(property, value);
}
}

11
test/parallel/test-vm-context.js

@ -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…
Cancel
Save