33 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44 */
55#include "wasm_loader_common.h"
6+ #include "bh_leb128.h"
67#include "bh_log.h"
78#if WASM_ENABLE_GC != 0
89#include "../common/gc/gc_type.h"
910#endif
1011
11- static void
12- set_error_buf (char * error_buf , uint32 error_buf_size , const char * string ,
13- bool is_aot )
12+ void
13+ wasm_loader_set_error_buf (char * error_buf , uint32 error_buf_size ,
14+ const char * string , bool is_aot )
1415{
1516 if (error_buf != NULL ) {
1617 snprintf (error_buf , error_buf_size , "%s module load failed: %s" ,
@@ -29,30 +30,30 @@ wasm_memory_check_flags(const uint8 mem_flag, char *error_buf,
2930 if (mem_flag & SHARED_MEMORY_FLAG ) {
3031 LOG_VERBOSE ("shared memory flag was found, please enable shared "
3132 "memory, lib-pthread or lib-wasi-threads" );
32- set_error_buf (error_buf , error_buf_size , "invalid limits flags" ,
33- is_aot );
33+ wasm_loader_set_error_buf (error_buf , error_buf_size ,
34+ "invalid limits flags" , is_aot );
3435 return false;
3536 }
3637#endif
3738#if WASM_ENABLE_MEMORY64 == 0
3839 if (mem_flag & MEMORY64_FLAG ) {
3940 LOG_VERBOSE ("memory64 flag was found, please enable memory64" );
40- set_error_buf (error_buf , error_buf_size , "invalid limits flags" ,
41- is_aot );
41+ wasm_loader_set_error_buf (error_buf , error_buf_size ,
42+ "invalid limits flags" , is_aot );
4243 return false;
4344 }
4445#endif
4546 }
4647
4748 if (mem_flag > MAX_PAGE_COUNT_FLAG + SHARED_MEMORY_FLAG + MEMORY64_FLAG ) {
48- set_error_buf (error_buf , error_buf_size , "invalid limits flags" ,
49- is_aot );
49+ wasm_loader_set_error_buf (error_buf , error_buf_size ,
50+ "invalid limits flags" , is_aot );
5051 return false;
5152 }
5253 else if ((mem_flag & SHARED_MEMORY_FLAG )
5354 && !(mem_flag & MAX_PAGE_COUNT_FLAG )) {
54- set_error_buf (error_buf , error_buf_size ,
55- "shared memory must have maximum" , is_aot );
55+ wasm_loader_set_error_buf (error_buf , error_buf_size ,
56+ "shared memory must have maximum" , is_aot );
5657 return false;
5758 }
5859
@@ -130,3 +131,33 @@ is_indices_overflow(uint32 import, uint32 other, char *error_buf,
130131
131132 return false;
132133}
134+
135+ bool
136+ read_leb (uint8 * * p_buf , const uint8 * buf_end , uint32 maxbits , bool sign ,
137+ uint64 * p_result , char * error_buf , uint32 error_buf_size )
138+ {
139+ size_t offset = 0 ;
140+ bh_leb_read_status_t status =
141+ bh_leb_read (* p_buf , buf_end , maxbits , sign , p_result , & offset );
142+
143+ switch (status ) {
144+ case BH_LEB_READ_SUCCESS :
145+ * p_buf += offset ;
146+ return true;
147+ case BH_LEB_READ_TOO_LONG :
148+ wasm_loader_set_error_buf (error_buf , error_buf_size ,
149+ "integer representation too long" , false);
150+ return false;
151+ case BH_LEB_READ_OVERFLOW :
152+ wasm_loader_set_error_buf (error_buf , error_buf_size ,
153+ "integer too large" , false);
154+ return false;
155+ case BH_LEB_READ_UNEXPECTED_END :
156+ wasm_loader_set_error_buf (error_buf , error_buf_size ,
157+ "unexpected end" , false);
158+ return false;
159+ default :
160+ bh_assert (false);
161+ return false;
162+ }
163+ }
0 commit comments