-
Notifications
You must be signed in to change notification settings - Fork 29.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
vm module regression in v18: setting properties on global proxy breaks jsdom #42962
Comments
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 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. |
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
The text was updated successfully, but these errors were encountered: