diff --git a/src/node_contextify.cc b/src/node_contextify.cc index 989ce5d6750..b4b47d7ad10 100644 --- a/src/node_contextify.cc +++ b/src/node_contextify.cc @@ -722,6 +722,11 @@ Intercepted ContextifyContext::PropertyDefinerCallback( Local sandbox = ctx->sandbox(); + if (is_declared && + !sandbox->HasOwnProperty(context, property).FromMaybe(true)) { + return Intercepted::kNo; + } + auto result = WithPropertyDescriptorCopied(isolate, desc, [&](PropertyDescriptor& d) { return sandbox->DefineProperty(context, property, d); diff --git a/test/parallel/test-vm-property-definer-partial-update.js b/test/parallel/test-vm-property-definer-partial-update.js index b2291b00a2b..48c2296ed71 100644 --- a/test/parallel/test-vm-property-definer-partial-update.js +++ b/test/parallel/test-vm-property-definer-partial-update.js @@ -54,3 +54,23 @@ const assert = require('assert'); assert.strictEqual( Object.getOwnPropertyDescriptor(context, 'c2').enumerable, false); } + +{ + const context = vm.createContext({}); + + const { before, after } = vm.runInContext(` + const { defineProperty, getOwnPropertyDescriptor } = Object; + const key = 'globalThis'; + ({ + before: getOwnPropertyDescriptor(globalThis, key), + after: getOwnPropertyDescriptor(defineProperty(globalThis, key, {}), key), + }); + `, context); + + assert.strictEqual(before.writable, true); + assert.strictEqual(before.configurable, true); + assert.strictEqual(after.writable, before.writable); + assert.strictEqual(after.enumerable, before.enumerable); + assert.strictEqual(after.configurable, before.configurable); + assert.strictEqual(typeof after.value, 'object'); +}