summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJinho Bang <zino@chromium.org>2018-01-08 23:37:27 +0900
committerMichael Dawson <michael_dawson@ca.ibm.com>2018-01-16 15:22:36 -0500
commit316b5efd6b02379a490ce62c31a13122729ff1dd (patch)
tree39db3752d7b7f7858dfc8bf38f0e31eda0b6e8bf /test
parent4319780389badf4e173f57408b42949a2841a188 (diff)
downloadandroid-node-v8-316b5efd6b02379a490ce62c31a13122729ff1dd.tar.gz
android-node-v8-316b5efd6b02379a490ce62c31a13122729ff1dd.tar.bz2
android-node-v8-316b5efd6b02379a490ce62c31a13122729ff1dd.zip
n-api: throw RangeError napi_create_typedarray()
According to the ECMA spec, we should throw a RangeError in the following cases: - `(length * elementSize) + offset` > the size of the array passed in - `offset % elementSize` != `0` In the current implementation, this check was omitted. So, the following code will cause a crash. ``` napi_create_typedarray(env, napi_uint16_array, 2 /* length */, buffer, 1 /* byte_offset */, &output_array); ``` This change fixes the problem and write some related tests. Refs: https://tc39.github.io/ecma262/#sec-typedarray-buffer-byteoffset-length PR-URL: https://github.com/nodejs/node/pull/18037 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Diffstat (limited to 'test')
-rw-r--r--test/addons-napi/test_typedarray/test.js18
-rw-r--r--test/addons-napi/test_typedarray/test_typedarray.c28
2 files changed, 43 insertions, 3 deletions
diff --git a/test/addons-napi/test_typedarray/test.js b/test/addons-napi/test_typedarray/test.js
index cc9d6cb6e1..ed37f3c5d4 100644
--- a/test/addons-napi/test_typedarray/test.js
+++ b/test/addons-napi/test_typedarray/test.js
@@ -55,3 +55,21 @@ arrayTypes.forEach((currentType) => {
assert.notStrictEqual(theArray, template);
assert.strictEqual(theArray.buffer, buffer);
});
+
+arrayTypes.forEach((currentType) => {
+ const template = Reflect.construct(currentType, buffer);
+ assert.throws(() => {
+ test_typedarray.CreateTypedArray(template, buffer, 0, 136);
+ }, /Invalid typed array length/);
+});
+
+const nonByteArrayTypes = [ Int16Array, Uint16Array, Int32Array, Uint32Array,
+ Float32Array, Float64Array ];
+nonByteArrayTypes.forEach((currentType) => {
+ const template = Reflect.construct(currentType, buffer);
+ assert.throws(() => {
+ test_typedarray.CreateTypedArray(template, buffer,
+ currentType.BYTES_PER_ELEMENT + 1, 1);
+ console.log(`start of offset ${currentType}`);
+ }, /start offset of/);
+});
diff --git a/test/addons-napi/test_typedarray/test_typedarray.c b/test/addons-napi/test_typedarray/test_typedarray.c
index 0325faedd0..82c7a5bf36 100644
--- a/test/addons-napi/test_typedarray/test_typedarray.c
+++ b/test/addons-napi/test_typedarray/test_typedarray.c
@@ -97,11 +97,11 @@ napi_value External(napi_env env, napi_callback_info info) {
}
napi_value CreateTypedArray(napi_env env, napi_callback_info info) {
- size_t argc = 2;
- napi_value args[2];
+ size_t argc = 4;
+ napi_value args[4];
NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
- NAPI_ASSERT(env, argc == 2, "Wrong number of arguments");
+ NAPI_ASSERT(env, argc == 2 || argc == 4, "Wrong number of arguments");
napi_value input_array = args[0];
napi_valuetype valuetype0;
@@ -136,6 +136,28 @@ napi_value CreateTypedArray(napi_env env, napi_callback_info info) {
NAPI_CALL(env, napi_get_typedarray_info(
env, input_array, &type, &length, NULL, &in_array_buffer, &byte_offset));
+ if (argc == 4) {
+ napi_valuetype valuetype2;
+ NAPI_CALL(env, napi_typeof(env, args[2], &valuetype2));
+
+ NAPI_ASSERT(env, valuetype2 == napi_number,
+ "Wrong type of arguments. Expects a number as third argument.");
+
+ uint32_t uint32_length;
+ NAPI_CALL(env, napi_get_value_uint32(env, args[2], &uint32_length));
+ length = uint32_length;
+
+ napi_valuetype valuetype3;
+ NAPI_CALL(env, napi_typeof(env, args[3], &valuetype3));
+
+ NAPI_ASSERT(env, valuetype3 == napi_number,
+ "Wrong type of arguments. Expects a number as third argument.");
+
+ uint32_t uint32_byte_offset;
+ NAPI_CALL(env, napi_get_value_uint32(env, args[3], &uint32_byte_offset));
+ byte_offset = uint32_byte_offset;
+ }
+
napi_value output_array;
NAPI_CALL(env, napi_create_typedarray(
env, type, length, input_buffer, byte_offset, &output_array));