From 1e53ac29ef0fd75f860f3158769b027098e41bab Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 14 May 2025 13:55:16 -0700 Subject: [PATCH] still protect against infinite unwinds, but require that both rsp/rip remain unchanged, rather than just rip --- src/ctrl/ctrl_core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 1c76c975..998a65ac 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -3099,6 +3099,7 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_Handle threa { // rjf: regs -> rip*module U64 rip = regs_rip_from_arch_block(arch, regs_block); + U64 rsp = regs_rsp_from_arch_block(arch, regs_block); CTRL_Entity *module = &ctrl_entity_nil; for(CTRL_Entity *m = process_entity->first; m != &ctrl_entity_nil; m = m->next) { @@ -3128,7 +3129,9 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_Handle threa unwind.flags |= step.flags; if(step.flags & CTRL_UnwindFlag_Error || regs_rsp_from_arch_block(arch, regs_block) == 0 || - regs_rip_from_arch_block(arch, regs_block) == 0) + regs_rip_from_arch_block(arch, regs_block) == 0 || + (regs_rsp_from_arch_block(arch, regs_block) == rsp && + regs_rip_from_arch_block(arch, regs_block) == rip)) { break; }