Improve stack consistency by ensuring sufficient space for dummy offsets (#4011)

One more corner case: if the `frame_offset` increases and becomes equal to
the `frame_offset_boundary` after the last assignment within the for loop.
This commit is contained in:
liang.he 2025-01-09 13:11:25 +08:00 committed by GitHub
parent a653746b7b
commit 02683d2eed
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -11228,21 +11228,23 @@ re_scan:
uint32 cell_num =
wasm_value_type_cell_num(func_type->types[i]);
if (i >= available_params) {
/* make sure enough space */
if (loader_ctx->p_code_compiled == NULL) {
loader_ctx->frame_offset += cell_num;
if (!check_offset_push(loader_ctx, error_buf,
error_buf_size))
goto fail;
/* for following dummy value assignemnt */
loader_ctx->frame_offset -= cell_num;
}
/* If there isn't enough data on stack, push a dummy
* offset to keep the stack consistent with
* frame_ref.
* Since the stack is already in polymorphic state,
* the opcode will not be executed, so the dummy
* offset won't cause any error */
uint32 n;
for (n = 0; n < cell_num; n++) {
if (loader_ctx->p_code_compiled == NULL) {
if (!check_offset_push(loader_ctx,
error_buf,
error_buf_size))
goto fail;
}
for (uint32 n = 0; n < cell_num; n++) {
*loader_ctx->frame_offset++ = 0;
}
}