From 8a60d40d37446e2ade33d57f55572634f844c8c3 Mon Sep 17 00:00:00 2001 From: Anshika Jain Date: Tue, 10 Nov 2026 02:03:59 +0530 Subject: [PATCH] vm: preserve attributes when redefining built-in globals Signed-off-by: Anshika Jain --- src/node_contextify.cc | 5 +++++ ...test-vm-property-definer-partial-update.js | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/node_contextify.cc b/src/node_contextify.cc index 989ce5d6750c..b4b47d7ad10d 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 b2291b00a2ba..48c2296ed718 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'); +}