Repository navigation
vm module regression in v18: setting properties on global proxy breaks jsdom #42962
Description
Activity
- changed the title
[-]vm module regression in in v18: setting properties on global proxy breaks jsdom[/-][+]vm module regression in v18: setting properties on global proxy breaks jsdom[/+]on May 4, 2022 Bisected into history I found that #42657 introduced the breakage. Will try to dig out the related V8 changes.
The problem seems to be with named interceptors in node_contextify.cc. What's happening is that the setter interceptor, even when setting the property on the backing sandbox object, does not signal that the assignment is in fact now intercepted. So V8 tries to redo the assignment, which uses define semantics when interceptors are present, and doesn't allow redefines to accessors. I don't really grok the interceptor stuff, and since it's special V8 embedder stuff, I'm not entirely surprised it's behaving very weirdly from a JS MOP perspective.
As a fix/workaround, reading https://github.com/nodejs/node/blob/master/src/node_contextify.cc#L461, ISTM the intention is that this interceptor intends to handle the assignment at that point. I.e., V8 should consider the assignment complete and not continue if execution reaches L461 of that setter interceptor. If that's the case, then
args.GetReturnValue()should be set with a non-null value to short-circuit, as per the API.cc @joyeecheung to see if the suggested fix above makes sense.
The behavior change is from https://bugs.chromium.org/p/chromium/issues/detail?id=1309225 (you might not be able to see this due to security sensitivity), where for a security fix it looks like setter interceptors behavior was perhaps inadvertently changed.
I'll try to follow up internally with V8 to understand the behavior of interceptors.
Reacted by Chengzhong Wu, William Chan, Sébastien Doeraene, Yahor Siarheyenka and Huáng JùnliàngReacted by Domenic Denicola- added a commit that references this issue
on May 4, 2022 - addedvmIssues and PRs related to the vm subsystem.Issues and PRs related to the vm subsystem.
on May 4, 2022 - added a commit that references this issue
on May 6, 2022 - added a commit that references this issue
on May 10, 2022 - added a commit that references this issue
on May 31, 2022 - added a commit that references this issue
on Jun 27, 2022
Version
v18.1.0
Platform
Microsoft Windows NT 10.0.22000.0 x64
Subsystem
vm
What steps will reproduce the bug?
Put this code in
vm-test.js:How often does it reproduce? Is there a required condition?
Always reproduces
What is the expected behavior?
The v17 behavior was relied upon by jsdom extensively. Using Node v17.9.0 you get:
What do you see instead?
Using Node v18.0.0 or v18.1.0 you get:
Additional information
No response