From: Pierrick Bouvier Date: Tue, 10 Feb 2026 20:13:41 +0000 (-0800) Subject: contrib/plugins/uftrace: fix infinite stack unwind detection X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b356560e2ecd83c507caf0b03569989e7607ab8;p=thirdparty%2Fqemu.git contrib/plugins/uftrace: fix infinite stack unwind detection So far, we were detecting infinite stacks but not stopping unwinding since break only exited inner loop. Reviewed-by: Philippe Mathieu-Daudé Link: https://lore.kernel.org/qemu-devel/20260210201344.1403613-2-pierrick.bouvier@linaro.org Signed-off-by: Pierrick Bouvier --- diff --git a/contrib/plugins/uftrace.c b/contrib/plugins/uftrace.c index a7e21b5b87..1ed982999e 100644 --- a/contrib/plugins/uftrace.c +++ b/contrib/plugins/uftrace.c @@ -443,7 +443,7 @@ static void cpu_unwind_stack(Cpu *cpu, uint64_t frame_pointer, uint64_t pc) /* check we don't have an infinite stack */ for (size_t i = 0; i < depth; ++i) { if (frame_pointer == unwind[i].frame_pointer) { - break; + goto after_unwind; } } CallstackEntry e = {.frame_pointer = frame_pointer, .pc = pc}; @@ -456,6 +456,7 @@ static void cpu_unwind_stack(Cpu *cpu, uint64_t frame_pointer, uint64_t pc) } while (frame_pointer && pc && depth < UNWIND_STACK_MAX_DEPTH); #undef UNWIND_STACK_MAX_DEPTH +after_unwind: /* push it from bottom to top */ while (depth) { callstack_push(cpu->cs, unwind[depth - 1]);