@@ -4705,8 +4705,8 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end,
47054705
47064706static bool
47074707load_data_segment_section(const uint8 *buf, const uint8 *buf_end,
4708- WASMModule *module, char *error_buf ,
4709- uint32 error_buf_size)
4708+ WASMModule *module, bool clone_data_seg ,
4709+ char *error_buf, uint32 error_buf_size)
47104710{
47114711 const uint8 *p = buf, *p_end = buf_end;
47124712 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,
48364836
48374837 dataseg->data_length = data_seg_len;
48384838 CHECK_BUF(p, p_end, data_seg_len);
4839- dataseg->data = (uint8 *)p;
4839+ if (clone_data_seg) {
4840+ if (!(dataseg->data = loader_malloc(
4841+ dataseg->data_length, error_buf, error_buf_size))) {
4842+ return false;
4843+ }
4844+
4845+ bh_memcpy_s(dataseg->data, dataseg->data_length, p,
4846+ data_seg_len);
4847+ }
4848+ else {
4849+ dataseg->data = (uint8 *)p;
4850+ }
4851+ dataseg->is_data_cloned = clone_data_seg;
48404852 p += data_seg_len;
48414853 }
48424854 }
@@ -5748,8 +5760,8 @@ static void **handle_table;
57485760
57495761static bool
57505762load_from_sections(WASMModule *module, WASMSection *sections,
5751- bool is_load_from_file_buf, char *error_buf ,
5752- uint32 error_buf_size)
5763+ bool is_load_from_file_buf, bool wasm_binary_freeable ,
5764+ char *error_buf, uint32 error_buf_size)
57535765{
57545766 WASMExport *export;
57555767 WASMSection *section = sections;
@@ -5764,6 +5776,8 @@ load_from_sections(WASMModule *module, WASMSection *sections,
57645776 uint32 aux_heap_base_global_index = (uint32)-1;
57655777 WASMFuncType *func_type;
57665778 uint8 malloc_free_io_type = VALUE_TYPE_I32;
5779+ bool reuse_const_strings = is_load_from_file_buf && !wasm_binary_freeable;
5780+ bool clone_data_seg = is_load_from_file_buf && wasm_binary_freeable;
57675781
57685782 /* Find code and function sections if have */
57695783 while (section) {
@@ -5790,7 +5804,7 @@ load_from_sections(WASMModule *module, WASMSection *sections,
57905804 case SECTION_TYPE_USER:
57915805 /* unsupported user section, ignore it. */
57925806 if (!load_user_section(buf, buf_end, module,
5793- is_load_from_file_buf , error_buf,
5807+ reuse_const_strings , error_buf,
57945808 error_buf_size))
57955809 return false;
57965810 break;
@@ -5801,7 +5815,7 @@ load_from_sections(WASMModule *module, WASMSection *sections,
58015815 break;
58025816 case SECTION_TYPE_IMPORT:
58035817 if (!load_import_section(buf, buf_end, module,
5804- is_load_from_file_buf , error_buf,
5818+ reuse_const_strings , error_buf,
58055819 error_buf_size))
58065820 return false;
58075821 break;
@@ -5835,7 +5849,7 @@ load_from_sections(WASMModule *module, WASMSection *sections,
58355849 break;
58365850 case SECTION_TYPE_EXPORT:
58375851 if (!load_export_section(buf, buf_end, module,
5838- is_load_from_file_buf , error_buf,
5852+ reuse_const_strings , error_buf,
58395853 error_buf_size))
58405854 return false;
58415855 break;
@@ -5855,7 +5869,8 @@ load_from_sections(WASMModule *module, WASMSection *sections,
58555869 return false;
58565870 break;
58575871 case SECTION_TYPE_DATA:
5858- if (!load_data_segment_section(buf, buf_end, module, error_buf,
5872+ if (!load_data_segment_section(buf, buf_end, module,
5873+ clone_data_seg, error_buf,
58595874 error_buf_size))
58605875 return false;
58615876 break;
@@ -5869,7 +5884,7 @@ load_from_sections(WASMModule *module, WASMSection *sections,
58695884#if WASM_ENABLE_STRINGREF != 0
58705885 case SECTION_TYPE_STRINGREF:
58715886 if (!load_stringref_section(buf, buf_end, module,
5872- is_load_from_file_buf , error_buf,
5887+ reuse_const_strings , error_buf,
58735888 error_buf_size))
58745889 return false;
58755890 break;
@@ -6321,7 +6336,7 @@ wasm_loader_load_from_sections(WASMSection *section_list, char *error_buf,
63216336 if (!module)
63226337 return NULL;
63236338
6324- if (!load_from_sections(module, section_list, false, error_buf,
6339+ if (!load_from_sections(module, section_list, false, true, error_buf,
63256340 error_buf_size)) {
63266341 wasm_loader_unload(module);
63276342 return NULL;
@@ -6494,7 +6509,7 @@ load(const uint8 *buf, uint32 size, WASMModule *module,
64946509 }
64956510
64966511 if (!create_sections(buf, size, §ion_list, error_buf, error_buf_size)
6497- || !load_from_sections(module, section_list, ! wasm_binary_freeable,
6512+ || !load_from_sections(module, section_list, true, wasm_binary_freeable,
64986513 error_buf, error_buf_size)) {
64996514 destroy_sections(section_list);
65006515 return false;
@@ -6823,8 +6838,11 @@ wasm_loader_unload(WASMModule *module)
68236838
68246839 if (module->data_segments) {
68256840 for (i = 0; i < module->data_seg_count; i++) {
6826- if (module->data_segments[i])
6841+ if (module->data_segments[i]) {
6842+ if (module->data_segments[i]->is_data_cloned)
6843+ wasm_runtime_free(module->data_segments[i]->data);
68276844 wasm_runtime_free(module->data_segments[i]);
6845+ }
68286846 }
68296847 wasm_runtime_free(module->data_segments);
68306848 }
0 commit comments