mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-11 09:25:20 +00:00
Fix read and validation of misc/simd/atomic sub opcodes (#3115)
The format of sub opcodes after misc, simd and atomic prefix is leb u32. The issue was found in #2921.
This commit is contained in:
parent
b3f728ceb3
commit
2eb60060d8
|
@ -24,6 +24,7 @@
|
||||||
- fast-interp: Fix frame_offset pop order (#3101)
|
- fast-interp: Fix frame_offset pop order (#3101)
|
||||||
- Fix AOT compilation on MacOS (#3102)
|
- Fix AOT compilation on MacOS (#3102)
|
||||||
- fast-interp: Fix block with parameter in polymorphic stack issue (#3112)
|
- fast-interp: Fix block with parameter in polymorphic stack issue (#3112)
|
||||||
|
- Fix read and validation of misc/simd/atomic sub opcodes (#3115)
|
||||||
|
|
||||||
### Enhancements
|
### Enhancements
|
||||||
- Clear compilation warning and dead code (#3002)
|
- Clear compilation warning and dead code (#3002)
|
||||||
|
|
|
@ -1050,7 +1050,9 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index)
|
||||||
uint32 opcode1;
|
uint32 opcode1;
|
||||||
|
|
||||||
read_leb_uint32(frame_ip, frame_ip_end, opcode1);
|
read_leb_uint32(frame_ip, frame_ip_end, opcode1);
|
||||||
opcode = (uint32)opcode1;
|
/* opcode1 was checked in loader and is no larger than
|
||||||
|
UINT8_MAX */
|
||||||
|
opcode = (uint8)opcode1;
|
||||||
|
|
||||||
#if WASM_ENABLE_BULK_MEMORY != 0
|
#if WASM_ENABLE_BULK_MEMORY != 0
|
||||||
if (WASM_OP_MEMORY_INIT <= opcode
|
if (WASM_OP_MEMORY_INIT <= opcode
|
||||||
|
@ -1211,10 +1213,13 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index)
|
||||||
case WASM_OP_ATOMIC_PREFIX:
|
case WASM_OP_ATOMIC_PREFIX:
|
||||||
{
|
{
|
||||||
uint8 bin_op, op_type;
|
uint8 bin_op, op_type;
|
||||||
|
uint32 opcode1;
|
||||||
|
|
||||||
|
read_leb_uint32(frame_ip, frame_ip_end, opcode1);
|
||||||
|
/* opcode1 was checked in loader and is no larger than
|
||||||
|
UINT8_MAX */
|
||||||
|
opcode = (uint8)opcode1;
|
||||||
|
|
||||||
if (frame_ip < frame_ip_end) {
|
|
||||||
opcode = *frame_ip++;
|
|
||||||
}
|
|
||||||
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
||||||
read_leb_uint32(frame_ip, frame_ip_end, align);
|
read_leb_uint32(frame_ip, frame_ip_end, align);
|
||||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||||
|
@ -1364,11 +1369,17 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index)
|
||||||
#if WASM_ENABLE_SIMD != 0
|
#if WASM_ENABLE_SIMD != 0
|
||||||
case WASM_OP_SIMD_PREFIX:
|
case WASM_OP_SIMD_PREFIX:
|
||||||
{
|
{
|
||||||
|
uint32 opcode1;
|
||||||
|
|
||||||
if (!comp_ctx->enable_simd) {
|
if (!comp_ctx->enable_simd) {
|
||||||
goto unsupport_simd;
|
goto unsupport_simd;
|
||||||
}
|
}
|
||||||
|
|
||||||
opcode = *frame_ip++;
|
read_leb_uint32(frame_ip, frame_ip_end, opcode1);
|
||||||
|
/* opcode1 was checked in loader and is no larger than
|
||||||
|
UINT8_MAX */
|
||||||
|
opcode = (uint8)opcode1;
|
||||||
|
|
||||||
/* follow the order of enum WASMSimdEXTOpcode in
|
/* follow the order of enum WASMSimdEXTOpcode in
|
||||||
wasm_opcode.h */
|
wasm_opcode.h */
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
|
|
|
@ -2257,7 +2257,9 @@ jit_compile_func(JitCompContext *cc)
|
||||||
uint32 opcode1;
|
uint32 opcode1;
|
||||||
|
|
||||||
read_leb_uint32(frame_ip, frame_ip_end, opcode1);
|
read_leb_uint32(frame_ip, frame_ip_end, opcode1);
|
||||||
opcode = (uint32)opcode1;
|
/* opcode1 was checked in loader and is no larger than
|
||||||
|
UINT8_MAX */
|
||||||
|
opcode = (uint8)opcode1;
|
||||||
|
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case WASM_OP_I32_TRUNC_SAT_S_F32:
|
case WASM_OP_I32_TRUNC_SAT_S_F32:
|
||||||
|
@ -2396,10 +2398,13 @@ jit_compile_func(JitCompContext *cc)
|
||||||
case WASM_OP_ATOMIC_PREFIX:
|
case WASM_OP_ATOMIC_PREFIX:
|
||||||
{
|
{
|
||||||
uint8 bin_op, op_type;
|
uint8 bin_op, op_type;
|
||||||
|
uint32 opcode1;
|
||||||
|
|
||||||
|
read_leb_uint32(frame_ip, frame_ip_end, opcode1);
|
||||||
|
/* opcode1 was checked in loader and is no larger than
|
||||||
|
UINT8_MAX */
|
||||||
|
opcode = (uint8)opcode1;
|
||||||
|
|
||||||
if (frame_ip < frame_ip_end) {
|
|
||||||
opcode = *frame_ip++;
|
|
||||||
}
|
|
||||||
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
||||||
read_leb_uint32(frame_ip, frame_ip_end, align);
|
read_leb_uint32(frame_ip, frame_ip_end, align);
|
||||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||||
|
|
|
@ -3511,6 +3511,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||||
uint32 opcode1;
|
uint32 opcode1;
|
||||||
|
|
||||||
read_leb_uint32(frame_ip, frame_ip_end, opcode1);
|
read_leb_uint32(frame_ip, frame_ip_end, opcode1);
|
||||||
|
/* opcode1 was checked in loader and is no larger than
|
||||||
|
UINT8_MAX */
|
||||||
opcode = (uint8)opcode1;
|
opcode = (uint8)opcode1;
|
||||||
|
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
|
@ -3843,8 +3845,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||||
HANDLE_OP(WASM_OP_ATOMIC_PREFIX)
|
HANDLE_OP(WASM_OP_ATOMIC_PREFIX)
|
||||||
{
|
{
|
||||||
uint32 offset = 0, align, addr;
|
uint32 offset = 0, align, addr;
|
||||||
|
uint32 opcode1;
|
||||||
|
|
||||||
opcode = *frame_ip++;
|
read_leb_uint32(frame_ip, frame_ip_end, opcode1);
|
||||||
|
/* opcode1 was checked in loader and is no larger than
|
||||||
|
UINT8_MAX */
|
||||||
|
opcode = (uint8)opcode1;
|
||||||
|
|
||||||
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
||||||
read_leb_uint32(frame_ip, frame_ip_end, align);
|
read_leb_uint32(frame_ip, frame_ip_end, align);
|
||||||
|
|
|
@ -5092,9 +5092,13 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
|
||||||
#if (WASM_ENABLE_WAMR_COMPILER != 0) || (WASM_ENABLE_JIT != 0)
|
#if (WASM_ENABLE_WAMR_COMPILER != 0) || (WASM_ENABLE_JIT != 0)
|
||||||
case WASM_OP_SIMD_PREFIX:
|
case WASM_OP_SIMD_PREFIX:
|
||||||
{
|
{
|
||||||
/* TODO: shall we ceate a table to be friendly to branch
|
uint32 opcode1;
|
||||||
* prediction */
|
|
||||||
opcode = read_uint8(p);
|
read_leb_uint32(p, p_end, opcode1);
|
||||||
|
/* opcode1 was checked in wasm_loader_prepare_bytecode and
|
||||||
|
is no larger than UINT8_MAX */
|
||||||
|
opcode = (uint8)opcode1;
|
||||||
|
|
||||||
/* follow the order of enum WASMSimdEXTOpcode in wasm_opcode.h
|
/* follow the order of enum WASMSimdEXTOpcode in wasm_opcode.h
|
||||||
*/
|
*/
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
|
@ -5184,8 +5188,14 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
case WASM_OP_ATOMIC_PREFIX:
|
case WASM_OP_ATOMIC_PREFIX:
|
||||||
{
|
{
|
||||||
/* atomic_op (1 u8) + memarg (2 u32_leb) */
|
uint32 opcode1;
|
||||||
opcode = read_uint8(p);
|
|
||||||
|
/* atomic_op (u32_leb) + memarg (2 u32_leb) */
|
||||||
|
read_leb_uint32(p, p_end, opcode1);
|
||||||
|
/* opcode1 was checked in wasm_loader_prepare_bytecode and
|
||||||
|
is no larger than UINT8_MAX */
|
||||||
|
opcode = (uint8)opcode1;
|
||||||
|
|
||||||
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
||||||
skip_leb_uint32(p, p_end); /* align */
|
skip_leb_uint32(p, p_end); /* align */
|
||||||
skip_leb_uint32(p, p_end); /* offset */
|
skip_leb_uint32(p, p_end); /* offset */
|
||||||
|
@ -9836,8 +9846,8 @@ re_scan:
|
||||||
{
|
{
|
||||||
uint32 opcode1;
|
uint32 opcode1;
|
||||||
|
|
||||||
CHECK_BUF(p, p_end, 1);
|
read_leb_uint32(p, p_end, opcode1);
|
||||||
opcode1 = read_uint8(p);
|
|
||||||
/* follow the order of enum WASMSimdEXTOpcode in wasm_opcode.h
|
/* follow the order of enum WASMSimdEXTOpcode in wasm_opcode.h
|
||||||
*/
|
*/
|
||||||
switch (opcode1) {
|
switch (opcode1) {
|
||||||
|
@ -10498,8 +10508,8 @@ re_scan:
|
||||||
{
|
{
|
||||||
uint32 opcode1;
|
uint32 opcode1;
|
||||||
|
|
||||||
CHECK_BUF(p, p_end, 1);
|
read_leb_uint32(p, p_end, opcode1);
|
||||||
opcode1 = read_uint8(p);
|
|
||||||
#if WASM_ENABLE_FAST_INTERP != 0
|
#if WASM_ENABLE_FAST_INTERP != 0
|
||||||
emit_byte(loader_ctx, opcode1);
|
emit_byte(loader_ctx, opcode1);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3492,8 +3492,11 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
|
||||||
uint32 opcode1;
|
uint32 opcode1;
|
||||||
|
|
||||||
read_leb_uint32(p, p_end, opcode1);
|
read_leb_uint32(p, p_end, opcode1);
|
||||||
|
/* opcode1 was checked in wasm_loader_prepare_bytecode and
|
||||||
|
is no larger than UINT8_MAX */
|
||||||
|
opcode = (uint8)opcode1;
|
||||||
|
|
||||||
switch (opcode1) {
|
switch (opcode) {
|
||||||
case WASM_OP_I32_TRUNC_SAT_S_F32:
|
case WASM_OP_I32_TRUNC_SAT_S_F32:
|
||||||
case WASM_OP_I32_TRUNC_SAT_U_F32:
|
case WASM_OP_I32_TRUNC_SAT_U_F32:
|
||||||
case WASM_OP_I32_TRUNC_SAT_S_F64:
|
case WASM_OP_I32_TRUNC_SAT_S_F64:
|
||||||
|
@ -3549,8 +3552,14 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
case WASM_OP_ATOMIC_PREFIX:
|
case WASM_OP_ATOMIC_PREFIX:
|
||||||
{
|
{
|
||||||
/* atomic_op (1 u8) + memarg (2 u32_leb) */
|
uint32 opcode1;
|
||||||
opcode = read_uint8(p);
|
|
||||||
|
/* atomic_op (u32_leb) + memarg (2 u32_leb) */
|
||||||
|
read_leb_uint32(p, p_end, opcode1);
|
||||||
|
/* opcode1 was checked in wasm_loader_prepare_bytecode and
|
||||||
|
is no larger than UINT8_MAX */
|
||||||
|
opcode = (uint8)opcode1;
|
||||||
|
|
||||||
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
||||||
skip_leb_uint32(p, p_end); /* align */
|
skip_leb_uint32(p, p_end); /* align */
|
||||||
skip_leb_uint32(p, p_end); /* offset */
|
skip_leb_uint32(p, p_end); /* offset */
|
||||||
|
@ -7464,11 +7473,14 @@ re_scan:
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
case WASM_OP_ATOMIC_PREFIX:
|
case WASM_OP_ATOMIC_PREFIX:
|
||||||
{
|
{
|
||||||
opcode = read_uint8(p);
|
uint32 opcode1;
|
||||||
|
|
||||||
|
read_leb_uint32(p, p_end, opcode1);
|
||||||
|
|
||||||
#if WASM_ENABLE_FAST_INTERP != 0
|
#if WASM_ENABLE_FAST_INTERP != 0
|
||||||
emit_byte(loader_ctx, opcode);
|
emit_byte(loader_ctx, opcode1);
|
||||||
#endif
|
#endif
|
||||||
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
if (opcode1 != WASM_OP_ATOMIC_FENCE) {
|
||||||
CHECK_MEMORY();
|
CHECK_MEMORY();
|
||||||
read_leb_uint32(p, p_end, align); /* align */
|
read_leb_uint32(p, p_end, align); /* align */
|
||||||
read_leb_uint32(p, p_end, mem_offset); /* offset */
|
read_leb_uint32(p, p_end, mem_offset); /* offset */
|
||||||
|
@ -7479,7 +7491,7 @@ re_scan:
|
||||||
#if WASM_ENABLE_JIT != 0 || WASM_ENABLE_WAMR_COMPILER != 0
|
#if WASM_ENABLE_JIT != 0 || WASM_ENABLE_WAMR_COMPILER != 0
|
||||||
func->has_memory_operations = true;
|
func->has_memory_operations = true;
|
||||||
#endif
|
#endif
|
||||||
switch (opcode) {
|
switch (opcode1) {
|
||||||
case WASM_OP_ATOMIC_NOTIFY:
|
case WASM_OP_ATOMIC_NOTIFY:
|
||||||
POP2_AND_PUSH(VALUE_TYPE_I32, VALUE_TYPE_I32);
|
POP2_AND_PUSH(VALUE_TYPE_I32, VALUE_TYPE_I32);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -627,8 +627,10 @@ main(int argc, char *argv[])
|
||||||
goto fail1;
|
goto fail1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_package_type(wasm_file, wasm_file_size) != Wasm_Module_Bytecode) {
|
if (wasm_file_size >= 4 /* length of MAGIC NUMBER */
|
||||||
printf("Invalid file type: expected wasm file but got other\n");
|
&& get_package_type(wasm_file, wasm_file_size)
|
||||||
|
!= Wasm_Module_Bytecode) {
|
||||||
|
printf("Invalid wasm file: magic header not detected\n");
|
||||||
goto fail2;
|
goto fail2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user