Free jump buffers leaked by cont_restore_thread
in WASI builds
This commit is contained in:
parent
45e814d116
commit
6874b289a1
Notes:
git
2025-04-27 06:47:46 +00:00
45
cont.c
45
cont.c
@ -1511,6 +1511,51 @@ cont_restore_thread(rb_context_t *cont)
|
|||||||
rb_raise(rb_eRuntimeError, "can't call across trace_func");
|
rb_raise(rb_eRuntimeError, "can't call across trace_func");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__wasm__) && !defined(__EMSCRIPTEN__)
|
||||||
|
if (th->ec->tag != sec->tag) {
|
||||||
|
/* find the lowest common ancestor tag of the current EC and the saved EC */
|
||||||
|
|
||||||
|
struct rb_vm_tag *lowest_common_ancestor = NULL;
|
||||||
|
size_t num_tags = 0;
|
||||||
|
size_t num_saved_tags = 0;
|
||||||
|
for (struct rb_vm_tag *tag = th->ec->tag; tag != NULL; tag = tag->prev) {
|
||||||
|
++num_tags;
|
||||||
|
}
|
||||||
|
for (struct rb_vm_tag *tag = sec->tag; tag != NULL; tag = tag->prev) {
|
||||||
|
++num_saved_tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t min_tags = num_tags <= num_saved_tags ? num_tags : num_saved_tags;
|
||||||
|
|
||||||
|
struct rb_vm_tag *tag = th->ec->tag;
|
||||||
|
while (num_tags > min_tags) {
|
||||||
|
tag = tag->prev;
|
||||||
|
--num_tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct rb_vm_tag *saved_tag = sec->tag;
|
||||||
|
while (num_saved_tags > min_tags) {
|
||||||
|
saved_tag = saved_tag->prev;
|
||||||
|
--num_saved_tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (min_tags > 0) {
|
||||||
|
if (tag == saved_tag) {
|
||||||
|
lowest_common_ancestor = tag;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
tag = tag->prev;
|
||||||
|
saved_tag = saved_tag->prev;
|
||||||
|
--min_tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* free all the jump buffers between the current EC's tag and the lowest common ancestor tag */
|
||||||
|
for (struct rb_vm_tag *tag = th->ec->tag; tag != lowest_common_ancestor; tag = tag->prev) {
|
||||||
|
rb_vm_tag_jmpbuf_deinit(&tag->buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* copy vm stack */
|
/* copy vm stack */
|
||||||
#ifdef CAPTURE_JUST_VALID_VM_STACK
|
#ifdef CAPTURE_JUST_VALID_VM_STACK
|
||||||
MEMCPY(th->ec->vm_stack,
|
MEMCPY(th->ec->vm_stack,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user