From c3541c3ab7490b3b9d4e1927422081a3a72ddb2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Lang=C3=B3?= Date: Thu, 23 Jun 2016 12:04:00 +0200 Subject: [PATCH] Check error values in API functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Internal functions cannot handle error values, so it must be avoided to pass error values to the engine. JerryScript-DCO-1.0-Signed-off-by: László Langó llango.u-szeged@partner.samsung.com --- jerry-core/jerry-api.h | 1 + jerry-core/jerry.c | 67 +++++++++++++++++++++++++++++++++++++++++- main-unix.c | 1 + 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/jerry-core/jerry-api.h b/jerry-core/jerry-api.h index 4065525f5..e3f14c76f 100644 --- a/jerry-core/jerry-api.h +++ b/jerry-core/jerry-api.h @@ -144,6 +144,7 @@ bool jerry_value_to_boolean (const jerry_value_t); jerry_value_t jerry_value_to_number (const jerry_value_t); jerry_value_t jerry_value_to_object (const jerry_value_t); jerry_value_t jerry_value_to_string (const jerry_value_t); +jerry_value_t jerry_value_remove_error_flag (const jerry_value_t); /** * Create functions of 'jerry_value_t' diff --git a/jerry-core/jerry.c b/jerry-core/jerry.c index 9031fe114..734740aa1 100644 --- a/jerry-core/jerry.c +++ b/jerry-core/jerry.c @@ -62,6 +62,8 @@ static jerry_flag_t jerry_flags; */ static bool jerry_api_available; +static const jerry_char_t *error_value_msg_p = (const jerry_char_t *) "argument cannot have an error flag"; + /** \addtogroup jerry_extension Jerry engine extension interface * @{ */ @@ -542,13 +544,18 @@ jerry_create_array_object (jerry_size_t size) /**< size of array */ * Set value of field in the specified array object * * @return true, if field value was set successfully - * throw exception, otherwise + * false, otherwise */ bool jerry_set_array_index_value (jerry_object_t *array_obj_p, /**< array object */ jerry_length_t index, /**< index to be written */ jerry_value_t value) /**< value to set */ { + if (ECMA_IS_VALUE_ERROR (value)) + { + return false; + } + ecma_string_t *str_idx_p = ecma_new_ecma_string_from_uint32 ((uint32_t) index); ecma_value_t set_completion = ecma_op_object_put (array_obj_p, str_idx_p, value, false); JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (set_completion)); @@ -857,6 +864,11 @@ jerry_add_object_field (jerry_object_t *object_p, /**< object to add field at */ { jerry_assert_api_available (); + if (ECMA_IS_VALUE_ERROR (field_value)) + { + return false; + } + bool is_successful = false; if (ecma_get_object_extensible (object_p)) @@ -1053,6 +1065,11 @@ jerry_set_object_field_value_sz (jerry_object_t *object_p, /**< object */ { jerry_assert_api_available (); + if (ECMA_IS_VALUE_ERROR (field_value)) + { + return false; + } + bool is_successful = true; ecma_string_t *field_name_str_p = ecma_new_ecma_string_from_utf8 ((lit_utf8_byte_t *) field_name_p, @@ -1235,6 +1252,14 @@ jerry_call_function (jerry_object_t *function_object_p, /**< function object to { jerry_assert_api_available (); + for (uint16_t i = 0; i < args_count; i++) + { + if (ECMA_IS_VALUE_ERROR (args_p[i])) + { + return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p)); + } + } + if (jerry_is_function (function_object_p)) { return jerry_invoke_function (false, function_object_p, this_arg_p, args_p, args_count); @@ -1260,6 +1285,14 @@ jerry_construct_object (jerry_object_t *function_object_p, /**< function object { jerry_assert_api_available (); + for (uint16_t i = 0; i < args_count; i++) + { + if (ECMA_IS_VALUE_ERROR (args_p[i])) + { + return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p)); + } + } + if (jerry_is_constructor (function_object_p)) { return jerry_invoke_function (true, function_object_p, NULL, args_p, args_count); @@ -2115,6 +2148,11 @@ jerry_value_to_boolean (const jerry_value_t value) /**< input value */ { jerry_assert_api_available (); + if (ECMA_IS_VALUE_ERROR (value)) + { + return false; + } + return ecma_op_to_boolean (value); } /* jerry_value_to_boolean */ @@ -2132,6 +2170,11 @@ jerry_value_to_number (const jerry_value_t value) /**< input value */ { jerry_assert_api_available (); + if (ECMA_IS_VALUE_ERROR (value)) + { + return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p)); + } + return ecma_op_to_number (value); } /* jerry_value_to_number */ @@ -2149,6 +2192,11 @@ jerry_value_to_object (const jerry_value_t value) /**< input value */ { jerry_assert_api_available (); + if (ECMA_IS_VALUE_ERROR (value)) + { + return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p)); + } + return ecma_op_to_object (value); } /* jerry_value_to_object */ @@ -2166,9 +2214,26 @@ jerry_value_to_string (const jerry_value_t value) /**< input value */ { jerry_assert_api_available (); + if (ECMA_IS_VALUE_ERROR (value)) + { + return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p)); + } + return ecma_op_to_string (value); } /* jerry_value_to_string */ +/** + * Remove the error flag + * + * @return converted normal value, if value is error + * unchanged value otherwise + */ +jerry_value_t +jerry_value_remove_error_flag (const jerry_value_t value) +{ + return (jerry_value_t) (value & ~ECMA_VALUE_ERROR_FLAG); +} /* jerry_value_remove_error_flag */ + /** * Get size of Jerry string * diff --git a/main-unix.c b/main-unix.c index 73b081920..4b3a34073 100644 --- a/main-unix.c +++ b/main-unix.c @@ -501,6 +501,7 @@ main (int argc, } else if (!jerry_value_is_undefined (err_value)) { + err_value = jerry_value_remove_error_flag (err_value); err_str_p = jerry_get_string_value (jerry_value_to_string (err_value)); jerry_release_value (err_value); }