|
@@ -4705,8 +4705,8 @@ fail:
|
|
|
|
|
|
|
|
static bool
|
|
static bool
|
|
|
load_data_segment_section(const uint8 *buf, const uint8 *buf_end,
|
|
load_data_segment_section(const uint8 *buf, const uint8 *buf_end,
|
|
|
- WASMModule *module, char *error_buf,
|
|
|
|
|
- uint32 error_buf_size)
|
|
|
|
|
|
|
+ WASMModule *module, bool clone_data_seg,
|
|
|
|
|
+ char *error_buf, uint32 error_buf_size)
|
|
|
{
|
|
{
|
|
|
const uint8 *p = buf, *p_end = buf_end;
|
|
const uint8 *p = buf, *p_end = buf_end;
|
|
|
uint32 data_seg_count, i, mem_index, data_seg_len;
|
|
uint32 data_seg_count, i, mem_index, data_seg_len;
|
|
@@ -4836,7 +4836,19 @@ load_data_segment_section(const uint8 *buf, const uint8 *buf_end,
|
|
|
|
|
|
|
|
dataseg->data_length = data_seg_len;
|
|
dataseg->data_length = data_seg_len;
|
|
|
CHECK_BUF(p, p_end, data_seg_len);
|
|
CHECK_BUF(p, p_end, data_seg_len);
|
|
|
- dataseg->data = (uint8 *)p;
|
|
|
|
|
|
|
+ if (clone_data_seg) {
|
|
|
|
|
+ if (!(dataseg->data = loader_malloc(
|
|
|
|
|
+ dataseg->data_length, error_buf, error_buf_size))) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ bh_memcpy_s(dataseg->data, dataseg->data_length, p,
|
|
|
|
|
+ data_seg_len);
|
|
|
|
|
+ }
|
|
|
|
|
+ else {
|
|
|
|
|
+ dataseg->data = (uint8 *)p;
|
|
|
|
|
+ }
|
|
|
|
|
+ dataseg->is_data_cloned = clone_data_seg;
|
|
|
p += data_seg_len;
|
|
p += data_seg_len;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -5748,8 +5760,8 @@ static void **handle_table;
|
|
|
|
|
|
|
|
static bool
|
|
static bool
|
|
|
load_from_sections(WASMModule *module, WASMSection *sections,
|
|
load_from_sections(WASMModule *module, WASMSection *sections,
|
|
|
- bool is_load_from_file_buf, char *error_buf,
|
|
|
|
|
- uint32 error_buf_size)
|
|
|
|
|
|
|
+ bool is_load_from_file_buf, bool wasm_binary_freeable,
|
|
|
|
|
+ char *error_buf, uint32 error_buf_size)
|
|
|
{
|
|
{
|
|
|
WASMExport *export;
|
|
WASMExport *export;
|
|
|
WASMSection *section = sections;
|
|
WASMSection *section = sections;
|
|
@@ -5764,6 +5776,8 @@ load_from_sections(WASMModule *module, WASMSection *sections,
|
|
|
uint32 aux_heap_base_global_index = (uint32)-1;
|
|
uint32 aux_heap_base_global_index = (uint32)-1;
|
|
|
WASMFuncType *func_type;
|
|
WASMFuncType *func_type;
|
|
|
uint8 malloc_free_io_type = VALUE_TYPE_I32;
|
|
uint8 malloc_free_io_type = VALUE_TYPE_I32;
|
|
|
|
|
+ bool reuse_const_strings = is_load_from_file_buf && !wasm_binary_freeable;
|
|
|
|
|
+ bool clone_data_seg = is_load_from_file_buf && wasm_binary_freeable;
|
|
|
|
|
|
|
|
/* Find code and function sections if have */
|
|
/* Find code and function sections if have */
|
|
|
while (section) {
|
|
while (section) {
|
|
@@ -5790,7 +5804,7 @@ load_from_sections(WASMModule *module, WASMSection *sections,
|
|
|
case SECTION_TYPE_USER:
|
|
case SECTION_TYPE_USER:
|
|
|
/* unsupported user section, ignore it. */
|
|
/* unsupported user section, ignore it. */
|
|
|
if (!load_user_section(buf, buf_end, module,
|
|
if (!load_user_section(buf, buf_end, module,
|
|
|
- is_load_from_file_buf, error_buf,
|
|
|
|
|
|
|
+ reuse_const_strings, error_buf,
|
|
|
error_buf_size))
|
|
error_buf_size))
|
|
|
return false;
|
|
return false;
|
|
|
break;
|
|
break;
|
|
@@ -5801,7 +5815,7 @@ load_from_sections(WASMModule *module, WASMSection *sections,
|
|
|
break;
|
|
break;
|
|
|
case SECTION_TYPE_IMPORT:
|
|
case SECTION_TYPE_IMPORT:
|
|
|
if (!load_import_section(buf, buf_end, module,
|
|
if (!load_import_section(buf, buf_end, module,
|
|
|
- is_load_from_file_buf, error_buf,
|
|
|
|
|
|
|
+ reuse_const_strings, error_buf,
|
|
|
error_buf_size))
|
|
error_buf_size))
|
|
|
return false;
|
|
return false;
|
|
|
break;
|
|
break;
|
|
@@ -5835,7 +5849,7 @@ load_from_sections(WASMModule *module, WASMSection *sections,
|
|
|
break;
|
|
break;
|
|
|
case SECTION_TYPE_EXPORT:
|
|
case SECTION_TYPE_EXPORT:
|
|
|
if (!load_export_section(buf, buf_end, module,
|
|
if (!load_export_section(buf, buf_end, module,
|
|
|
- is_load_from_file_buf, error_buf,
|
|
|
|
|
|
|
+ reuse_const_strings, error_buf,
|
|
|
error_buf_size))
|
|
error_buf_size))
|
|
|
return false;
|
|
return false;
|
|
|
break;
|
|
break;
|
|
@@ -5855,7 +5869,8 @@ load_from_sections(WASMModule *module, WASMSection *sections,
|
|
|
return false;
|
|
return false;
|
|
|
break;
|
|
break;
|
|
|
case SECTION_TYPE_DATA:
|
|
case SECTION_TYPE_DATA:
|
|
|
- if (!load_data_segment_section(buf, buf_end, module, error_buf,
|
|
|
|
|
|
|
+ if (!load_data_segment_section(buf, buf_end, module,
|
|
|
|
|
+ clone_data_seg, error_buf,
|
|
|
error_buf_size))
|
|
error_buf_size))
|
|
|
return false;
|
|
return false;
|
|
|
break;
|
|
break;
|
|
@@ -5869,7 +5884,7 @@ load_from_sections(WASMModule *module, WASMSection *sections,
|
|
|
#if WASM_ENABLE_STRINGREF != 0
|
|
#if WASM_ENABLE_STRINGREF != 0
|
|
|
case SECTION_TYPE_STRINGREF:
|
|
case SECTION_TYPE_STRINGREF:
|
|
|
if (!load_stringref_section(buf, buf_end, module,
|
|
if (!load_stringref_section(buf, buf_end, module,
|
|
|
- is_load_from_file_buf, error_buf,
|
|
|
|
|
|
|
+ reuse_const_strings, error_buf,
|
|
|
error_buf_size))
|
|
error_buf_size))
|
|
|
return false;
|
|
return false;
|
|
|
break;
|
|
break;
|
|
@@ -6321,7 +6336,7 @@ wasm_loader_load_from_sections(WASMSection *section_list, char *error_buf,
|
|
|
if (!module)
|
|
if (!module)
|
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
|
|
- if (!load_from_sections(module, section_list, false, error_buf,
|
|
|
|
|
|
|
+ if (!load_from_sections(module, section_list, false, true, error_buf,
|
|
|
error_buf_size)) {
|
|
error_buf_size)) {
|
|
|
wasm_loader_unload(module);
|
|
wasm_loader_unload(module);
|
|
|
return NULL;
|
|
return NULL;
|
|
@@ -6494,7 +6509,7 @@ load(const uint8 *buf, uint32 size, WASMModule *module,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (!create_sections(buf, size, §ion_list, error_buf, error_buf_size)
|
|
if (!create_sections(buf, size, §ion_list, error_buf, error_buf_size)
|
|
|
- || !load_from_sections(module, section_list, !wasm_binary_freeable,
|
|
|
|
|
|
|
+ || !load_from_sections(module, section_list, true, wasm_binary_freeable,
|
|
|
error_buf, error_buf_size)) {
|
|
error_buf, error_buf_size)) {
|
|
|
destroy_sections(section_list);
|
|
destroy_sections(section_list);
|
|
|
return false;
|
|
return false;
|
|
@@ -6823,8 +6838,11 @@ wasm_loader_unload(WASMModule *module)
|
|
|
|
|
|
|
|
if (module->data_segments) {
|
|
if (module->data_segments) {
|
|
|
for (i = 0; i < module->data_seg_count; i++) {
|
|
for (i = 0; i < module->data_seg_count; i++) {
|
|
|
- if (module->data_segments[i])
|
|
|
|
|
|
|
+ if (module->data_segments[i]) {
|
|
|
|
|
+ if (module->data_segments[i]->is_data_cloned)
|
|
|
|
|
+ wasm_runtime_free(module->data_segments[i]->data);
|
|
|
wasm_runtime_free(module->data_segments[i]);
|
|
wasm_runtime_free(module->data_segments[i]);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
wasm_runtime_free(module->data_segments);
|
|
wasm_runtime_free(module->data_segments);
|
|
|
}
|
|
}
|