Skip to content

Commit e6e3b32

Browse files
committed
feat(instruction-metering): add find_metering_resume_call_boundary function for frame state validation
1 parent e661e59 commit e6e3b32

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

core/iwasm/interpreter/wasm_interp_classic.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,6 +1575,18 @@ clear_metering_suspend_state(WASMExecEnv *exec_env)
15751575
exec_env->metering_suspend_argc = 0;
15761576
exec_env->metering_suspend_argv = NULL;
15771577
}
1578+
1579+
static inline WASMRuntimeFrame *
1580+
find_metering_resume_call_boundary(WASMRuntimeFrame *suspended_frame)
1581+
{
1582+
WASMRuntimeFrame *frame = suspended_frame;
1583+
1584+
while (frame && frame->prev_frame && frame->prev_frame->function) {
1585+
frame = frame->prev_frame;
1586+
}
1587+
1588+
return frame ? frame->prev_frame : NULL;
1589+
}
15781590
#endif
15791591

15801592
static void
@@ -7501,15 +7513,15 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
75017513
"resume is pending");
75027514
return;
75037515
}
7504-
if (!suspended_frame->prev_frame) {
7516+
frame = find_metering_resume_call_boundary(suspended_frame);
7517+
if (!frame) {
75057518
wasm_set_exception(module_inst,
75067519
"invalid metering resume frame state");
75077520
clear_metering_suspend_state(exec_env);
75087521
return;
75097522
}
75107523

75117524
resume_metering = true;
7512-
frame = suspended_frame->prev_frame;
75137525
prev_frame = frame->prev_frame;
75147526
wasm_exec_env_set_cur_frame(exec_env, suspended_frame);
75157527
}

core/iwasm/interpreter/wasm_interp_fast.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,18 @@ clear_metering_suspend_state(WASMExecEnv *exec_env)
132132
exec_env->metering_suspend_argc = 0;
133133
exec_env->metering_suspend_argv = NULL;
134134
}
135+
136+
static inline WASMRuntimeFrame *
137+
find_metering_resume_call_boundary(WASMRuntimeFrame *suspended_frame)
138+
{
139+
WASMRuntimeFrame *frame = suspended_frame;
140+
141+
while (frame && frame->prev_frame && frame->prev_frame->function) {
142+
frame = frame->prev_frame;
143+
}
144+
145+
return frame ? frame->prev_frame : NULL;
146+
}
135147
#endif
136148

137149
static inline uint32
@@ -7992,15 +8004,15 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
79928004
"resume is pending");
79938005
return;
79948006
}
7995-
if (!suspended_frame->prev_frame) {
8007+
frame = find_metering_resume_call_boundary(suspended_frame);
8008+
if (!frame) {
79968009
wasm_set_exception(module_inst,
79978010
"invalid metering resume frame state");
79988011
clear_metering_suspend_state(exec_env);
79998012
return;
80008013
}
80018014

80028015
resume_metering = true;
8003-
frame = suspended_frame->prev_frame;
80048016
prev_frame = frame->prev_frame;
80058017
wasm_exec_env_set_cur_frame(exec_env, suspended_frame);
80068018
}

0 commit comments

Comments
 (0)