From 51cd080bb38ba73b0eca3bdfa3ce641e2d61aec6 Mon Sep 17 00:00:00 2001 From: wenyongh Date: Mon, 16 Sep 2019 14:49:17 +0800 Subject: [PATCH] Refine wgl lib and refine wasm function index check (#122) Refine wgl lib: remove module_inst parameter from widget functions Refine wasm function check: move function index check from interpreter call_indirect to runtime instantiate --- .../native/extension/gui/wgl_btn_wrapper.c | 3 +- .../lib/native/extension/gui/wgl_cb_wrapper.c | 17 ++++++----- .../native/extension/gui/wgl_label_wrapper.c | 17 ++++++----- .../native/extension/gui/wgl_list_wrapper.c | 3 +- .../native/extension/gui/wgl_native_utils.c | 29 ++++++++++++------- .../native/extension/gui/wgl_native_utils.h | 12 ++++---- .../native/extension/gui/wgl_obj_wrapper.c | 3 +- core/iwasm/runtime/vmcore-wasm/wasm_interp.c | 7 ++--- core/iwasm/runtime/vmcore-wasm/wasm_runtime.c | 15 ++++++++-- 9 files changed, 65 insertions(+), 41 deletions(-) diff --git a/core/iwasm/lib/native/extension/gui/wgl_btn_wrapper.c b/core/iwasm/lib/native/extension/gui/wgl_btn_wrapper.c index fa46cb66a2..04ed88a066 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_btn_wrapper.c +++ b/core/iwasm/lib/native/extension/gui/wgl_btn_wrapper.c @@ -51,7 +51,8 @@ wasm_btn_native_call(wasm_module_inst_t module_inst, { uint32 size = sizeof(btn_native_func_defs) / sizeof(WGLNativeFuncDef); - wgl_native_func_call(btn_native_func_defs, + wgl_native_func_call(module_inst, + btn_native_func_defs, size, func_id, argv_offset, diff --git a/core/iwasm/lib/native/extension/gui/wgl_cb_wrapper.c b/core/iwasm/lib/native/extension/gui/wgl_cb_wrapper.c index d0ed63e075..b999ffa343 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_cb_wrapper.c +++ b/core/iwasm/lib/native/extension/gui/wgl_cb_wrapper.c @@ -23,12 +23,14 @@ /* ------------------------------------------------------------------------- * Label widget native function wrappers * -------------------------------------------------------------------------*/ -static int32 _cb_create(lv_obj_t *par, lv_obj_t *copy) +static int32 +_cb_create(lv_obj_t *par, lv_obj_t *copy) { return wgl_native_wigdet_create(WIDGET_TYPE_CB, par, copy); } -static int32 _cb_get_text_length(lv_obj_t *cb) +static int32 +_cb_get_text_length(lv_obj_t *cb) { const char *text = lv_cb_get_text(cb); @@ -38,9 +40,9 @@ static int32 _cb_get_text_length(lv_obj_t *cb) return strlen(text); } -static int32 _cb_get_text(lv_obj_t *cb, char *buffer, int buffer_len) +static char * +_cb_get_text(lv_obj_t *cb, char *buffer, int buffer_len) { - wasm_module_inst_t module_inst = get_module_inst(); const char *text = lv_cb_get_text(cb); if (text == NULL) @@ -49,7 +51,7 @@ static int32 _cb_get_text(lv_obj_t *cb, char *buffer, int buffer_len) strncpy(buffer, text, buffer_len - 1); buffer[buffer_len - 1] = '\0'; - return addr_native_to_app(buffer); + return buffer; } static WGLNativeFuncDef cb_native_func_defs[] = { @@ -57,7 +59,7 @@ static WGLNativeFuncDef cb_native_func_defs[] = { { CB_FUNC_ID_SET_TEXT, lv_cb_set_text, NO_RET, 2, {0, -1}, {1, -1} }, { CB_FUNC_ID_SET_STATIC_TEXT, lv_cb_set_static_text, NO_RET, 2, {0, -1}, {1, -1} }, { CB_FUNC_ID_GET_TEXT_LENGTH, _cb_get_text_length, HAS_RET, 1, {0, -1}, {-1} }, - { CB_FUNC_ID_GET_TEXT, _cb_get_text, HAS_RET, 3, {0, -1}, {1, -1} }, + { CB_FUNC_ID_GET_TEXT, _cb_get_text, RET_PTR, 3, {0, -1}, {1, -1} }, }; /*************** Native Interface to Wasm App ***********/ @@ -67,7 +69,8 @@ wasm_cb_native_call(wasm_module_inst_t module_inst, { uint32 size = sizeof(cb_native_func_defs) / sizeof(WGLNativeFuncDef); - wgl_native_func_call(cb_native_func_defs, + wgl_native_func_call(module_inst, + cb_native_func_defs, size, func_id, argv_offset, diff --git a/core/iwasm/lib/native/extension/gui/wgl_label_wrapper.c b/core/iwasm/lib/native/extension/gui/wgl_label_wrapper.c index a99b591b3b..3c39382d82 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_label_wrapper.c +++ b/core/iwasm/lib/native/extension/gui/wgl_label_wrapper.c @@ -23,12 +23,14 @@ /* ------------------------------------------------------------------------- * Label widget native function wrappers * -------------------------------------------------------------------------*/ -static int32 _label_create(lv_obj_t *par, lv_obj_t *copy) +static int32 +_label_create(lv_obj_t *par, lv_obj_t *copy) { return wgl_native_wigdet_create(WIDGET_TYPE_LABEL, par, copy); } -static int32 _label_get_text_length(lv_obj_t *label) +static int32 +_label_get_text_length(lv_obj_t *label) { char *text = lv_label_get_text(label); @@ -38,9 +40,9 @@ static int32 _label_get_text_length(lv_obj_t *label) return strlen(text); } -static int32 _label_get_text(lv_obj_t *label, char *buffer, int buffer_len) +static char * +_label_get_text(lv_obj_t *label, char *buffer, int buffer_len) { - wasm_module_inst_t module_inst = get_module_inst(); char *text = lv_label_get_text(label); if (text == NULL) @@ -49,14 +51,14 @@ static int32 _label_get_text(lv_obj_t *label, char *buffer, int buffer_len) strncpy(buffer, text, buffer_len - 1); buffer[buffer_len - 1] = '\0'; - return addr_native_to_app(buffer); + return buffer; } static WGLNativeFuncDef label_native_func_defs[] = { { LABEL_FUNC_ID_CREATE, _label_create, HAS_RET, 2, {0 | NULL_OK, 1 | NULL_OK, -1}, {-1} }, { LABEL_FUNC_ID_SET_TEXT, lv_label_set_text, NO_RET, 2, {0, -1}, {1, -1} }, { LABEL_FUNC_ID_GET_TEXT_LENGTH, _label_get_text_length, HAS_RET, 1, {0, -1}, {-1} }, - { LABEL_FUNC_ID_GET_TEXT, _label_get_text, HAS_RET, 3, {0, -1}, {1, -1} }, + { LABEL_FUNC_ID_GET_TEXT, _label_get_text, RET_PTR, 3, {0, -1}, {1, -1} }, }; /*************** Native Interface to Wasm App ***********/ @@ -66,7 +68,8 @@ wasm_label_native_call(wasm_module_inst_t module_inst, { uint32 size = sizeof(label_native_func_defs) / sizeof(WGLNativeFuncDef); - wgl_native_func_call(label_native_func_defs, + wgl_native_func_call(module_inst, + label_native_func_defs, size, func_id, argv_offset, diff --git a/core/iwasm/lib/native/extension/gui/wgl_list_wrapper.c b/core/iwasm/lib/native/extension/gui/wgl_list_wrapper.c index 59040fc050..2d633ac62e 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_list_wrapper.c +++ b/core/iwasm/lib/native/extension/gui/wgl_list_wrapper.c @@ -57,7 +57,8 @@ wasm_list_native_call(wasm_module_inst_t module_inst, { uint32 size = sizeof(list_native_func_defs) / sizeof(WGLNativeFuncDef); - wgl_native_func_call(list_native_func_defs, + wgl_native_func_call(module_inst, + list_native_func_defs, size, func_id, argv_offset, diff --git a/core/iwasm/lib/native/extension/gui/wgl_native_utils.c b/core/iwasm/lib/native/extension/gui/wgl_native_utils.c index 98bd85c65f..1d51a7ae15 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_native_utils.c +++ b/core/iwasm/lib/native/extension/gui/wgl_native_utils.c @@ -7,7 +7,7 @@ #include -#define THROW_EXC(msg) wasm_runtime_set_exception(get_module_inst(), msg); +#define THROW_EXC(msg) wasm_runtime_set_exception(module_inst, msg); void wasm_runtime_set_exception(wasm_module_inst_t module, const char *exception); @@ -44,7 +44,8 @@ uint32 wgl_native_wigdet_create(int8 widget_type, lv_obj_t *par, lv_obj_t *copy) return 0; } -static void invokeNative(intptr_t argv[], uint32 argc, void (*native_code)()) +static void invokeNative(wasm_module_inst_t module_inst, + intptr_t argv[], uint32 argc, void (*native_code)()) { switch(argc) { case 0: @@ -87,20 +88,20 @@ static void invokeNative(intptr_t argv[], uint32 argc, void (*native_code)()) default: /* FIXME: If this happen, add more cases. */ - wasm_runtime_set_exception(get_module_inst(), - "the argument number of native function exceeds maximum"); + THROW_EXC("the argument number of native function exceeds maximum"); return; } } typedef void (*GenericFunctionPointer)(); -typedef int32 (*Int32FuncPtr)(intptr_t *, uint32, GenericFunctionPointer); -typedef void (*VoidFuncPtr)(intptr_t *, uint32, GenericFunctionPointer); +typedef int32 (*Int32FuncPtr)(wasm_module_inst_t, intptr_t *, uint32, GenericFunctionPointer); +typedef void (*VoidFuncPtr)(wasm_module_inst_t, intptr_t *, uint32, GenericFunctionPointer); static Int32FuncPtr invokeNative_Int32 = (Int32FuncPtr)invokeNative; static VoidFuncPtr invokeNative_Void = (VoidFuncPtr)invokeNative; -void wgl_native_func_call(WGLNativeFuncDef *funcs, +void wgl_native_func_call(wasm_module_inst_t module_inst, + WGLNativeFuncDef *funcs, uint32 size, int32 func_id, uint32 argv_offset, @@ -109,7 +110,6 @@ void wgl_native_func_call(WGLNativeFuncDef *funcs, WGLNativeFuncDef *func_def = funcs; WGLNativeFuncDef *func_def_end = func_def + size; uint32 *argv; - wasm_module_inst_t module_inst = get_module_inst(); if (!validate_app_addr(argv_offset, argc * sizeof(uint32))) return; @@ -173,13 +173,20 @@ void wgl_native_func_call(WGLNativeFuncDef *funcs, } if (func_def->has_ret == NO_RET) - invokeNative_Void(argv_copy, + invokeNative_Void(module_inst, + argv_copy, func_def->arg_num, func_def->func_ptr); - else - argv[0] = invokeNative_Int32(argv_copy, + else { + argv[0] = invokeNative_Int32(module_inst, + argv_copy, func_def->arg_num, func_def->func_ptr); + /* Convert to app memory offset if return value is a + * native address pointer */ + if (func_def->has_ret == RET_PTR) + argv[0] = addr_native_to_app((char *)(intptr_t)argv[0]); + } if (argv_copy != argv_copy_buf) bh_free(argv_copy); diff --git a/core/iwasm/lib/native/extension/gui/wgl_native_utils.h b/core/iwasm/lib/native/extension/gui/wgl_native_utils.h index 201548c523..1761e28f71 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_native_utils.h +++ b/core/iwasm/lib/native/extension/gui/wgl_native_utils.h @@ -17,8 +17,12 @@ extern "C" { #define NULL_OK 0x80 enum { + /* The function has a normal return value (not a pointer) */ HAS_RET, - NO_RET + /* The function doesn't have return value */ + NO_RET, + /* The function's return value is a native address pointer */ + RET_PTR }; enum { @@ -61,15 +65,13 @@ uint32 wgl_native_wigdet_create(int8 widget_type, lv_obj_t *par, lv_obj_t *copy); -void wgl_native_func_call(WGLNativeFuncDef *funcs, +void wgl_native_func_call(wasm_module_inst_t module_inst, + WGLNativeFuncDef *funcs, uint32 size, int32 func_id, uint32 argv_offset, uint32 argc); -wasm_module_inst_t wasm_runtime_get_current_module_inst(); -#define get_module_inst() wasm_runtime_get_current_module_inst() - #ifdef __cplusplus } #endif diff --git a/core/iwasm/lib/native/extension/gui/wgl_obj_wrapper.c b/core/iwasm/lib/native/extension/gui/wgl_obj_wrapper.c index 625077626d..158b413163 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_obj_wrapper.c +++ b/core/iwasm/lib/native/extension/gui/wgl_obj_wrapper.c @@ -347,7 +347,8 @@ wasm_obj_native_call(wasm_module_inst_t module_inst, { uint32 size = sizeof(obj_native_func_defs) / sizeof(WGLNativeFuncDef); - wgl_native_func_call(obj_native_func_defs, + wgl_native_func_call(module_inst, + obj_native_func_defs, size, func_id, argv_offset, diff --git a/core/iwasm/runtime/vmcore-wasm/wasm_interp.c b/core/iwasm/runtime/vmcore-wasm/wasm_interp.c index d4afabe5e1..73e9f9035a 100644 --- a/core/iwasm/runtime/vmcore-wasm/wasm_interp.c +++ b/core/iwasm/runtime/vmcore-wasm/wasm_interp.c @@ -880,11 +880,8 @@ wasm_interp_call_func_bytecode(WASMThread *self, } fidx = ((uint32*)table->base_addr)[val]; - if (fidx >= module->function_count) { - wasm_runtime_set_exception(module, "function index is overflow"); - goto got_exception; - } - + /* Skip function index check, it has been checked + in wasm module instantiate */ cur_func = module->functions + fidx; if (cur_func->is_import_func) diff --git a/core/iwasm/runtime/vmcore-wasm/wasm_runtime.c b/core/iwasm/runtime/vmcore-wasm/wasm_runtime.c index 39fa66c9ca..0e992bb4f8 100644 --- a/core/iwasm/runtime/vmcore-wasm/wasm_runtime.c +++ b/core/iwasm/runtime/vmcore-wasm/wasm_runtime.c @@ -741,7 +741,7 @@ wasm_runtime_instantiate(WASMModule *module, WASMTableSeg *table_seg; WASMDataSeg *data_seg; WASMGlobalInstance *globals = NULL, *global; - uint32 global_count, addr_data_size = 0, global_data_size = 0, i; + uint32 global_count, addr_data_size = 0, global_data_size = 0, i, j; uint32 base_offset, length, memory_size; uint8 *global_data, *global_data_end, *addr_data, *addr_data_end; uint8 *memory_data; @@ -927,6 +927,15 @@ wasm_runtime_instantiate(WASMModule *module, module_inst->default_table->cur_size) length = module_inst->default_table->cur_size - table_seg->base_offset.u.i32; + /* Check function index */ + for (j = 0; j < length; j++) { + if (table_seg->func_indexes[j] >= module_inst->function_count) { + set_error_buf(error_buf, error_buf_size, + "function index is overflow"); + wasm_runtime_deinstantiate(module_inst); + return NULL; + } + } memcpy(table_data + table_seg->base_offset.u.i32, table_seg->func_indexes, length * sizeof(uint32)); } @@ -1618,9 +1627,9 @@ wasm_runtime_invoke_native(void *func_ptr, WASMType *func_type, break; case VALUE_TYPE_F32: if (n_fps < MAX_REG_FLOATS) - *(float64*)&fps[n_fps++] = *(float32*)argv_src++; + *(float32*)&fps[n_fps++] = *(float32*)argv_src++; else - *(float64*)&stacks[n_stacks++] = *(float32*)argv_src++; + *(float32*)&stacks[n_stacks++] = *(float32*)argv_src++; break; case VALUE_TYPE_F64: if (n_fps < MAX_REG_FLOATS)