From 9e83032adab468a3d5e4b7127dfd2c0c77860c8c Mon Sep 17 00:00:00 2001 From: Daniel Vince Date: Thu, 24 Oct 2019 15:04:38 +0200 Subject: [PATCH] Fix error type when creating TypedArray with detached ArrayBuffer (#3230) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Based on the ES2015 standard TypeError should be returned when a TypedArray is created for a detached ArrayBuffer. JerryScript-DCO-1.0-Signed-off-by: Dániel Vince vinced@inf.u-szeged.hu --- .../ecma/operations/ecma-typedarray-object.c | 2 +- tests/unit-core/test-typedarray.c | 77 +++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/jerry-core/ecma/operations/ecma-typedarray-object.c b/jerry-core/ecma/operations/ecma-typedarray-object.c index d4509a0cc..adbf1e6d0 100644 --- a/jerry-core/ecma/operations/ecma-typedarray-object.c +++ b/jerry-core/ecma/operations/ecma-typedarray-object.c @@ -968,7 +968,7 @@ ecma_op_create_typedarray (const ecma_value_t *arguments_list_p, /**< the arg li } else if (ecma_arraybuffer_is_detached (arraybuffer_p)) { - ret = ecma_raise_range_error (ECMA_ERR_MSG ("Invalid detached ArrayBuffer.")); + ret = ecma_raise_type_error (ECMA_ERR_MSG ("Invalid detached ArrayBuffer.")); } else { diff --git a/tests/unit-core/test-typedarray.c b/tests/unit-core/test-typedarray.c index 1459d038f..31e0d145d 100644 --- a/tests/unit-core/test-typedarray.c +++ b/tests/unit-core/test-typedarray.c @@ -400,6 +400,81 @@ static void test_property_by_index (test_entry_t test_entries[]) } } /* test_property_by_index */ +static void +test_detached_arraybuffer (void) +{ + static jerry_typedarray_type_t types[] = + { + JERRY_TYPEDARRAY_UINT8, + JERRY_TYPEDARRAY_UINT8CLAMPED, + JERRY_TYPEDARRAY_INT8, + JERRY_TYPEDARRAY_UINT16, + JERRY_TYPEDARRAY_INT16, + JERRY_TYPEDARRAY_UINT32, + JERRY_TYPEDARRAY_INT32, + JERRY_TYPEDARRAY_FLOAT32, + JERRY_TYPEDARRAY_FLOAT64, + }; + + /* Creating an TypedArray for a detached array buffer with a given length/offset is invalid */ + { + uint8_t buf[1]; + const uint32_t length = 1; + jerry_value_t arraybuffer = jerry_create_arraybuffer_external (length, buf, NULL); + TEST_ASSERT (!jerry_value_is_error (arraybuffer)); + TEST_ASSERT (jerry_value_is_arraybuffer (arraybuffer)); + TEST_ASSERT (jerry_get_arraybuffer_byte_length (arraybuffer) == length); + + jerry_value_t is_detachable = jerry_is_arraybuffer_detachable (arraybuffer); + TEST_ASSERT (!jerry_value_is_error (is_detachable)); + TEST_ASSERT (jerry_get_boolean_value (is_detachable)); + jerry_release_value (is_detachable); + + jerry_value_t res = jerry_detach_arraybuffer (arraybuffer); + TEST_ASSERT (!jerry_value_is_error (res)); + jerry_release_value (res); + + for (size_t idx = 0; idx < (sizeof (types) / sizeof (types[0])); idx++) + { + jerry_value_t typedarray = jerry_create_typedarray_for_arraybuffer_sz (types[idx], arraybuffer, 0, 4); + TEST_ASSERT (jerry_value_is_error (typedarray)); + TEST_ASSERT (jerry_get_error_type (typedarray) == JERRY_ERROR_TYPE); + jerry_release_value (typedarray); + } + + jerry_release_value (arraybuffer); + } + + /* Creating an TypedArray for a detached array buffer without length/offset is valid */ + { + uint8_t buf[1]; + const uint32_t length = 1; + jerry_value_t arraybuffer = jerry_create_arraybuffer_external (length, buf, NULL); + TEST_ASSERT (!jerry_value_is_error (arraybuffer)); + TEST_ASSERT (jerry_value_is_arraybuffer (arraybuffer)); + TEST_ASSERT (jerry_get_arraybuffer_byte_length (arraybuffer) == length); + + jerry_value_t is_detachable = jerry_is_arraybuffer_detachable (arraybuffer); + TEST_ASSERT (!jerry_value_is_error (is_detachable)); + TEST_ASSERT (jerry_get_boolean_value (is_detachable)); + jerry_release_value (is_detachable); + + jerry_value_t res = jerry_detach_arraybuffer (arraybuffer); + TEST_ASSERT (!jerry_value_is_error (res)); + jerry_release_value (res); + + for (size_t idx = 0; idx < (sizeof (types) / sizeof (types[0])); idx++) + { + jerry_value_t typedarray = jerry_create_typedarray_for_arraybuffer (types[idx], arraybuffer); + TEST_ASSERT (jerry_value_is_error (typedarray)); + TEST_ASSERT (jerry_get_error_type (typedarray) == JERRY_ERROR_TYPE); + jerry_release_value (typedarray); + } + + jerry_release_value (arraybuffer); + } +} /* test_detached_arraybuffer */ + int main (void) { @@ -571,6 +646,8 @@ main (void) } } + test_detached_arraybuffer (); + jerry_cleanup (); return 0;