-
Notifications
You must be signed in to change notification settings - Fork 29.8k
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
Function returned by vm.compileFunction
can't accept arguments when cachedData
is passed
#48175
Comments
cc @nodejs/vm |
If you use the same functions / parameters it works as expected: const vm = require('vm');
const code = `
const os = require('os');
console.log(os.release());
`;
const fn = vm.compileFunction(code, ['require'], {
produceCachedData: true,
});
console.log(`fn: [${fn.toString()}]`);
fn(require);
const fn2 = vm.compileFunction(code, ['require'], {
cachedData: fn.cachedData,
});
console.log(`fn2: [${fn2.toString()}]`);
fn2(require); perhaps we can update the documentation to make this more clear? |
Fixes: nodejs#48175 Signed-off-by: Darshan Sen <[email protected]>
Done - #48193 |
The current implementation seems unsafe. Can we validate the cached data somehow? Maybe we can put our own header on the bytes. |
Note it's not just parameters, the code is not validated either: > vm = require('vm')
> f = vm.compileFunction('return 1', [], {produceCachedData: true})
[Function (anonymous)] {
cachedDataProduced: true,
cachedData: <Buffer 62 05 de c0 0f 3a dc 34 08 00 00 00 2f 12 c5 a8 90 01 00 00 15 22 82 81 01 1c 53 01 20 07 a8 60 00 00 00 00 03 00 00 00 5d 07 d9 01 01 0c 4b 61 00 00 ... 374 more bytes>
}
> vm.compileFunction('return 2', [], {cachedData: f.cachedData})()
1 Doing something intelligent here would break tools like bytenode which rely on us not verifying that the code matches the cached data (although we could work with them to minimize breakage). Any change here is probably semver-major. |
Fixes: #48175 Signed-off-by: Darshan Sen <[email protected]> PR-URL: #48193 Reviewed-By: Debadree Chatterjee <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
Fixes: #48175 Signed-off-by: Darshan Sen <[email protected]> PR-URL: #48193 Reviewed-By: Debadree Chatterjee <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
Fixes: nodejs#48175 Signed-off-by: Darshan Sen <[email protected]> PR-URL: nodejs#48193 Reviewed-By: Debadree Chatterjee <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
Fixes: nodejs#48175 Signed-off-by: Darshan Sen <[email protected]> PR-URL: nodejs#48193 Reviewed-By: Debadree Chatterjee <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
Fixes: nodejs#48175 Signed-off-by: Darshan Sen <[email protected]> PR-URL: nodejs#48193 Reviewed-By: Debadree Chatterjee <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
Version
v20.2.0
Platform
Darwin Darshans-MacBook-Pro.local 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 21:00:17 PST 2023; root:xnu-8796.101.5~3/RELEASE_X86_64 x86_64
Subsystem
vm
What steps will reproduce the bug?
test.js
Also, note that when I print the function, it doesn't have the
function (...) {
and}
wrappers. I have no idea how that's even possible.However, if I comment out the part where
cachedData
is being passed tovm.compileFunction
, it doesn't run into errors.test.js
How often does it reproduce? Is there a required condition?
Reproduces always consistently.
What is the expected behavior?
The returned function should have the params wrapped in.
Why is that the expected behavior?
The doc says that this would return a function with the passed params wrapped in but in this case, it doesn't seem to do so.
What do you see instead?
The returned function does not have the params wrapped in.
Additional information
AFAICT, Node.js simply passes the args to V8's
ScriptCompiler::CompileFunction
function innode/src/node_contextify.cc
Lines 1248 to 1256 in e530098
The text was updated successfully, but these errors were encountered: