From 606b6320898a7c1a15f27d6d22c8a63746dbcd21 Mon Sep 17 00:00:00 2001 From: toyobayashi Date: Tue, 30 Jan 2024 22:09:37 +0800 Subject: [PATCH 1/2] test: make napi_get_buffer_info check if passed buffer is valid --- packages/emnapi/src/value/convert2c.ts | 6 ++---- packages/test/buffer/binding.c | 15 +++++++++++++++ packages/test/buffer/buffer.test.js | 3 +++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/emnapi/src/value/convert2c.ts b/packages/emnapi/src/value/convert2c.ts index f212de3c..668e5d07 100644 --- a/packages/emnapi/src/value/convert2c.ts +++ b/packages/emnapi/src/value/convert2c.ts @@ -3,7 +3,7 @@ import { SIZE_TYPE, from64, makeGetValue, makeSetValue } from 'emscripten:parse- import { $emnapiSetValueI64 as emnapiSetValueI64 } from '../util' import { emnapiString } from '../string' import { emnapiExternalMemory } from '../memory' -import { $CHECK_ARG, $CHECK_ENV_NOT_IN_GC, $PREAMBLE } from '../macro' +import { $CHECK_ARG, $CHECK_ENV_NOT_IN_GC, $PREAMBLE, $RETURN_STATUS_IF_FALSE } from '../macro' /** * @__sig ippp @@ -165,9 +165,7 @@ export function napi_get_buffer_info ( const envObject: Env = $CHECK_ENV_NOT_IN_GC!(env) $CHECK_ARG!(envObject, buffer) const handle = emnapiCtx.handleStore.get(buffer)! - if (!handle.isBuffer()) { - return envObject.setLastError(napi_status.napi_invalid_arg) - } + $RETURN_STATUS_IF_FALSE!(envObject, handle.isBuffer(), napi_status.napi_invalid_arg) return napi_get_typedarray_info(env, buffer, 0, length, data, 0, 0) } diff --git a/packages/test/buffer/binding.c b/packages/test/buffer/binding.c index 938ac53b..257bac5d 100644 --- a/packages/test/buffer/binding.c +++ b/packages/test/buffer/binding.c @@ -140,6 +140,20 @@ static napi_value staticBuffer(napi_env env, napi_callback_info info) { return theBuffer; } +static napi_value invalidObjectAsBuffer(napi_env env, napi_callback_info info) { + size_t argc = 1; + napi_value args[1]; + NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); + NODE_API_ASSERT(env, argc == 1, "Wrong number of arguments"); + + napi_value notTheBuffer = args[0]; + napi_status status = napi_get_buffer_info(env, notTheBuffer, NULL, NULL); + NODE_API_ASSERT(env, status == napi_invalid_arg, + "napi_get_buffer_info: should fail with napi_invalid_arg when passed non buffer"); + + return notTheBuffer; +} + static napi_value getMemoryDataAsArray(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value args[1]; @@ -190,6 +204,7 @@ static napi_value Init(napi_env env, napi_value exports) { DECLARE_NODE_API_PROPERTY("bufferHasInstance", bufferHasInstance), DECLARE_NODE_API_PROPERTY("bufferInfo", bufferInfo), DECLARE_NODE_API_PROPERTY("staticBuffer", staticBuffer), + DECLARE_NODE_API_PROPERTY("invalidObjectAsBuffer", invalidObjectAsBuffer), DECLARE_NODE_API_PROPERTY("getMemoryDataAsArray", getMemoryDataAsArray), }; diff --git a/packages/test/buffer/buffer.test.js b/packages/test/buffer/buffer.test.js index 23620e3a..4f3f13e9 100644 --- a/packages/test/buffer/buffer.test.js +++ b/packages/test/buffer/buffer.test.js @@ -18,6 +18,9 @@ module.exports = load('buffer').then(async binding => { assert.strictEqual(binding.bufferInfo(buffer), true) buffer = null await common.gcUntil(() => binding.getDeleterCallCount() === 2) + + // To test this doesn't crash + binding.invalidObjectAsBuffer({}) })().then(common.mustCall()) process.externalBuffer = binding.newExternalBuffer() From 1a934c7e630f9e5553ab70313fe536c2fbd030ac Mon Sep 17 00:00:00 2001 From: toyobayashi Date: Sat, 24 Feb 2024 11:06:11 +0800 Subject: [PATCH 2/2] format --- packages/test/buffer/binding.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/test/buffer/binding.c b/packages/test/buffer/binding.c index 257bac5d..54735849 100644 --- a/packages/test/buffer/binding.c +++ b/packages/test/buffer/binding.c @@ -148,8 +148,10 @@ static napi_value invalidObjectAsBuffer(napi_env env, napi_callback_info info) { napi_value notTheBuffer = args[0]; napi_status status = napi_get_buffer_info(env, notTheBuffer, NULL, NULL); - NODE_API_ASSERT(env, status == napi_invalid_arg, - "napi_get_buffer_info: should fail with napi_invalid_arg when passed non buffer"); + NODE_API_ASSERT(env, + status == napi_invalid_arg, + "napi_get_buffer_info: should fail with napi_invalid_arg " + "when passed non buffer"); return notTheBuffer; }