You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
ffi: Fast API string buffer is corrupted by reentrant callbacks #64550
import{dlopen}from'node:ffi';const{ lib, functions }=dlopen('./librepro.dylib',{inner: {arguments: ['string'],return: 'i32',},// `pointer` keeps this function eligible for the Fast API path.outer: {arguments: ['string','pointer'],return: 'i32',},});letnestedLength;constcallback=lib.registerCallback(()=>{nestedLength=functions.inner('INNER');});console.log('outer string unchanged:',functions.outer('OUTER',callback),);console.log('nested length:',nestedLength);lib.unregisterCallback(callback);lib.close();
How often does it reproduce? Is there a required condition?
Always
What is the expected behavior? Why is that the expected behavior?
outer string unchanged: 1nested length: 5
The outer string remains valid and unchanged for the entire native call.
What do you see instead?
outer string unchanged: 0nested length: 5
The nested call overwrites the outer call’s argument-0 string buffer, so native code sees "INNER" instead of "OUTER"
Activity
ffi: preserve strings during reentrant calls
ffi: preserve strings during reentrant calls
ffi: preserve strings during reentrant calls