Skip to content

Commit

Permalink
vm: pass attributes from sandbox
Browse files Browse the repository at this point in the history
GlobalPropertyQueryCallback() was returning `None`
as attributes for all properties, without regard
to actual properties settings.

This patch looks up attributes for sandbox-defined
properties and returns them.  Partial fix for nodejsgh-864

Add test for nodejsgh-864, non-default settings of
object properties (e.g., `enumerable: false`) are not
visible when object is used as a sandbox
  • Loading branch information
smikes committed Feb 19, 2015
1 parent 9b6b055 commit 2dfd002
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 4 deletions.
12 changes: 8 additions & 4 deletions src/node_contextify.cc
Original file line number Diff line number Diff line change
Expand Up @@ -387,11 +387,15 @@ class ContextifyContext {
Local<Object> proxy_global = PersistentToLocal(isolate,
ctx->proxy_global_);

bool in_sandbox = sandbox->GetRealNamedProperty(property).IsEmpty();
bool in_sandbox = !(sandbox->GetRealNamedProperty(property).IsEmpty());
bool in_proxy_global =
proxy_global->GetRealNamedProperty(property).IsEmpty();
if (!in_sandbox || !in_proxy_global) {
args.GetReturnValue().Set(None);
!(proxy_global->GetRealNamedProperty(property).IsEmpty());
if (in_sandbox || in_proxy_global) {
v8::PropertyAttribute attr = None;
if (in_sandbox) {
attr = sandbox->GetPropertyAttributes(property);
}
args.GetReturnValue().Set(attr);
}
}

Expand Down
24 changes: 24 additions & 0 deletions test/parallel/test-vm-preserves-property.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
var common = require('../common');
var assert = require('assert');

var vm = require('vm');

var code = 'Object.getOwnPropertyDescriptor(this, "prop")';

var x = {};
Object.defineProperty(x, "prop", {
configurable: false,
enumerable: false,
writable: false,
value: "val"
});
var o = vm.createContext(x);

var res = vm.runInContext(code, o, 'test');

assert(res);
assert.equal(typeof res, 'object');
assert.equal(res.value, "val");
assert.equal(res.configurable, false, "should not be configurable");
assert.equal(res.enumerable, false, "should not be enumerable");
assert.equal(res.writable, false, "should not be writable");

0 comments on commit 2dfd002

Please sign in to comment.