From 73414d12c2381b3c30edfaef796b8a151f751e26 Mon Sep 17 00:00:00 2001 From: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Date: Sat, 24 Oct 2026 23:54:24 -0700 Subject: [PATCH] ffi: reject arguments after callback in registerCallback Passing the signature after the callback silently created a `void ()` callback, so native callers got no arguments forwarded and an undefined return value. Signed-off-by: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Assisted-by: claude:opus-5.5 --- src/node_ffi.cc | 4 ++++ test/ffi/test-ffi-callbacks.js | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/node_ffi.cc b/src/node_ffi.cc index fe110eeae8e..ea46a1d72db 100644 --- a/src/node_ffi.cc +++ b/src/node_ffi.cc @@ -1081,6 +1081,10 @@ void DynamicLibrary::RegisterCallback(const FunctionCallbackInfo& args) { } if (args[0]->IsFunction()) { + if (args.Length() > 1) { + THROW_ERR_INVALID_ARG_TYPE(env, "Callback must be the last argument"); + return; + } fn = args[0].As(); } else { if (!args[0]->IsObject() || args[0]->IsArray()) { diff --git a/test/ffi/test-ffi-callbacks.js b/test/ffi/test-ffi-callbacks.js index 2dca67d6605..70dc23d2cc2 100644 --- a/test/ffi/test-ffi-callbacks.js +++ b/test/ffi/test-ffi-callbacks.js @@ -63,6 +63,10 @@ test('ffi callback ref and unref APIs work', () => { return 0; }, ); + assert.throws(() => lib.registerCallback(() => {}, { arguments: ['i32'], return: 'i32' }), { + code: 'ERR_INVALID_ARG_TYPE', + message: 'Callback must be the last argument', + }); try { lib.unrefCallback(voidCallback);