Skip to content

Commit 14c455b

Browse files
jiangzidongyichoi
authored andcommitted
[native pointer] Check if freecb is NULL before calling it (#1789)
JerryScript-DCO-1.0-Signed-off-by: Zidong Jiang [email protected]
1 parent 6ecee7e commit 14c455b

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

jerry-core/ecma/base/ecma-gc.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,9 +418,13 @@ ecma_gc_free_native_pointer (ecma_property_t *property_p, /**< property */
418418
{
419419
if (native_pointer_p->info_p != NULL)
420420
{
421-
const jerry_object_native_info_t *native_info_p = (const jerry_object_native_info_t *) native_pointer_p->info_p;
421+
jerry_object_free_callback_t free_cb;
422+
free_cb = (jerry_object_free_callback_t) ((const jerry_object_native_info_t *) native_pointer_p->info_p)->free_cb;
422423

423-
native_info_p->free_cb (native_pointer_p->data_p);
424+
if (free_cb != NULL)
425+
{
426+
free_cb ((uintptr_t) native_pointer_p->data_p);
427+
}
424428
}
425429
}
426430
} /* ecma_gc_free_native_pointer */

tests/unit-core/test-api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ handler_construct_freecb (void *native_p)
132132

133133
JERRY_DEFINE_NATIVE_HANDLE_INFO (bind1, handler_construct_freecb);
134134
JERRY_DEFINE_NATIVE_HANDLE_INFO (bind2, handler_construct_freecb);
135+
JERRY_DEFINE_NATIVE_HANDLE_INFO (bind3, NULL);
135136

136137
static jerry_value_t
137138
handler_construct (const jerry_value_t func_obj_val, /**< function object */
@@ -768,6 +769,14 @@ main (void)
768769

769770
jerry_release_value (res);
770771

772+
/* Test: It is ok to set native pointer's free callback as NULL. */
773+
jerry_value_t obj_freecb = jerry_create_object ();
774+
jerry_set_object_native_pointer (obj_freecb,
775+
(void *) 0x1234,
776+
&JERRY_NATIVE_HANDLE_INFO_FOR_CTYPE (bind3));
777+
778+
jerry_release_value (obj_freecb);
779+
771780
/* Test: Throwing exception from native handler. */
772781
throw_test_handler_val = jerry_create_external_function (handler_throw_test);
773782
TEST_ASSERT (jerry_value_is_function (throw_test_handler_val));

0 commit comments

Comments
 (0)