Skip to content

Commit 1a0127b

Browse files
committed
Check error values in API functions
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
1 parent 130be84 commit 1a0127b

File tree

3 files changed

+68
-1
lines changed

3 files changed

+68
-1
lines changed

jerry-core/jerry-api.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ bool jerry_value_to_boolean (const jerry_value_t);
144144
jerry_value_t jerry_value_to_number (const jerry_value_t);
145145
jerry_value_t jerry_value_to_object (const jerry_value_t);
146146
jerry_value_t jerry_value_to_string (const jerry_value_t);
147+
jerry_value_t jerry_value_remove_error_flag (const jerry_value_t);
147148

148149
/**
149150
* Create functions of 'jerry_value_t'

jerry-core/jerry.c

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ static jerry_flag_t jerry_flags;
6262
*/
6363
static bool jerry_api_available;
6464

65+
static const jerry_char_t *error_value_msg_p = (const jerry_char_t *) "argument cannot have an error flag";
66+
6567
/** \addtogroup jerry_extension Jerry engine extension interface
6668
* @{
6769
*/
@@ -542,13 +544,18 @@ jerry_create_array_object (jerry_size_t size) /**< size of array */
542544
* Set value of field in the specified array object
543545
*
544546
* @return true, if field value was set successfully
545-
* throw exception, otherwise
547+
* false, otherwise
546548
*/
547549
bool
548550
jerry_set_array_index_value (jerry_object_t *array_obj_p, /**< array object */
549551
jerry_length_t index, /**< index to be written */
550552
jerry_value_t value) /**< value to set */
551553
{
554+
if (ECMA_IS_VALUE_ERROR (value))
555+
{
556+
return false;
557+
}
558+
552559
ecma_string_t *str_idx_p = ecma_new_ecma_string_from_uint32 ((uint32_t) index);
553560
ecma_value_t set_completion = ecma_op_object_put (array_obj_p, str_idx_p, value, false);
554561
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 */
857864
{
858865
jerry_assert_api_available ();
859866

867+
if (ECMA_IS_VALUE_ERROR (field_value))
868+
{
869+
return false;
870+
}
871+
860872
bool is_successful = false;
861873

862874
if (ecma_get_object_extensible (object_p))
@@ -1053,6 +1065,11 @@ jerry_set_object_field_value_sz (jerry_object_t *object_p, /**< object */
10531065
{
10541066
jerry_assert_api_available ();
10551067

1068+
if (ECMA_IS_VALUE_ERROR (field_value))
1069+
{
1070+
return false;
1071+
}
1072+
10561073
bool is_successful = true;
10571074

10581075
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
12351252
{
12361253
jerry_assert_api_available ();
12371254

1255+
for (uint16_t i = 0; i < args_count; i++)
1256+
{
1257+
if (ECMA_IS_VALUE_ERROR (args_p[i]))
1258+
{
1259+
return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p));
1260+
}
1261+
}
1262+
12381263
if (jerry_is_function (function_object_p))
12391264
{
12401265
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
12601285
{
12611286
jerry_assert_api_available ();
12621287

1288+
for (uint16_t i = 0; i < args_count; i++)
1289+
{
1290+
if (ECMA_IS_VALUE_ERROR (args_p[i]))
1291+
{
1292+
return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p));
1293+
}
1294+
}
1295+
12631296
if (jerry_is_constructor (function_object_p))
12641297
{
12651298
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 */
21152148
{
21162149
jerry_assert_api_available ();
21172150

2151+
if (ECMA_IS_VALUE_ERROR (value))
2152+
{
2153+
return false;
2154+
}
2155+
21182156
return ecma_op_to_boolean (value);
21192157
} /* jerry_value_to_boolean */
21202158

@@ -2132,6 +2170,11 @@ jerry_value_to_number (const jerry_value_t value) /**< input value */
21322170
{
21332171
jerry_assert_api_available ();
21342172

2173+
if (ECMA_IS_VALUE_ERROR (value))
2174+
{
2175+
return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p));
2176+
}
2177+
21352178
return ecma_op_to_number (value);
21362179
} /* jerry_value_to_number */
21372180

@@ -2149,6 +2192,11 @@ jerry_value_to_object (const jerry_value_t value) /**< input value */
21492192
{
21502193
jerry_assert_api_available ();
21512194

2195+
if (ECMA_IS_VALUE_ERROR (value))
2196+
{
2197+
return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p));
2198+
}
2199+
21522200
return ecma_op_to_object (value);
21532201
} /* jerry_value_to_object */
21542202

@@ -2166,9 +2214,26 @@ jerry_value_to_string (const jerry_value_t value) /**< input value */
21662214
{
21672215
jerry_assert_api_available ();
21682216

2217+
if (ECMA_IS_VALUE_ERROR (value))
2218+
{
2219+
return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p));
2220+
}
2221+
21692222
return ecma_op_to_string (value);
21702223
} /* jerry_value_to_string */
21712224

2225+
/**
2226+
* Remove the error flag
2227+
*
2228+
* @return converted normal value, if value is error
2229+
* unchanged value otherwise
2230+
*/
2231+
jerry_value_t
2232+
jerry_value_remove_error_flag (const jerry_value_t value)
2233+
{
2234+
return (jerry_value_t) (value & ~ECMA_VALUE_ERROR_FLAG);
2235+
} /* jerry_value_remove_error_flag */
2236+
21722237
/**
21732238
* Get size of Jerry string
21742239
*

main-unix.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,7 @@ main (int argc,
501501
}
502502
else if (!jerry_value_is_undefined (err_value))
503503
{
504+
err_value = jerry_value_to_normal_value (err_value);
504505
err_str_p = jerry_get_string_value (jerry_value_to_string (err_value));
505506
jerry_release_value (err_value);
506507
}

0 commit comments

Comments
 (0)