From 14c455bcd863f0afc7b3a975614ca6bb71a44510 Mon Sep 17 00:00:00 2001 From: Zidong Jiang Date: Fri, 28 Apr 2017 08:01:40 +0800 Subject: [PATCH] [native pointer] Check if freecb is NULL before calling it (#1789) JerryScript-DCO-1.0-Signed-off-by: Zidong Jiang zidong.jiang@intel.com --- jerry-core/ecma/base/ecma-gc.c | 8 ++++++-- tests/unit-core/test-api.c | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/jerry-core/ecma/base/ecma-gc.c b/jerry-core/ecma/base/ecma-gc.c index 0be7836b0..e08ea0d98 100644 --- a/jerry-core/ecma/base/ecma-gc.c +++ b/jerry-core/ecma/base/ecma-gc.c @@ -418,9 +418,13 @@ ecma_gc_free_native_pointer (ecma_property_t *property_p, /**< property */ { if (native_pointer_p->info_p != NULL) { - const jerry_object_native_info_t *native_info_p = (const jerry_object_native_info_t *) native_pointer_p->info_p; + jerry_object_free_callback_t free_cb; + free_cb = (jerry_object_free_callback_t) ((const jerry_object_native_info_t *) native_pointer_p->info_p)->free_cb; - native_info_p->free_cb (native_pointer_p->data_p); + if (free_cb != NULL) + { + free_cb ((uintptr_t) native_pointer_p->data_p); + } } } } /* ecma_gc_free_native_pointer */ diff --git a/tests/unit-core/test-api.c b/tests/unit-core/test-api.c index e7e2c44e7..7593b2673 100644 --- a/tests/unit-core/test-api.c +++ b/tests/unit-core/test-api.c @@ -132,6 +132,7 @@ handler_construct_freecb (void *native_p) JERRY_DEFINE_NATIVE_HANDLE_INFO (bind1, handler_construct_freecb); JERRY_DEFINE_NATIVE_HANDLE_INFO (bind2, handler_construct_freecb); +JERRY_DEFINE_NATIVE_HANDLE_INFO (bind3, NULL); static jerry_value_t handler_construct (const jerry_value_t func_obj_val, /**< function object */ @@ -768,6 +769,14 @@ main (void) jerry_release_value (res); + /* Test: It is ok to set native pointer's free callback as NULL. */ + jerry_value_t obj_freecb = jerry_create_object (); + jerry_set_object_native_pointer (obj_freecb, + (void *) 0x1234, + &JERRY_NATIVE_HANDLE_INFO_FOR_CTYPE (bind3)); + + jerry_release_value (obj_freecb); + /* Test: Throwing exception from native handler. */ throw_test_handler_val = jerry_create_external_function (handler_throw_test); TEST_ASSERT (jerry_value_is_function (throw_test_handler_val));