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);