From 15f2d1f4be1e875c46b2794f29adecd1ef2e9134 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Wed, 20 Feb 2013 20:29:48 +0000 Subject: [PATCH] [Sanitizer] Try to fix infinite loop in frame pointer unwinder Using > instead of >= ensures that each frame deref makes progress and that we eventually terminate. Issue: https://code.google.com/p/address-sanitizer/issues/detail?id=162 llvm-svn: 175661 --- compiler-rt/lib/sanitizer_common/sanitizer_stacktrace.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace.cc b/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace.cc index 639a69c..6309b23 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace.cc @@ -131,8 +131,9 @@ void StackTrace::FastUnwindStack(uptr pc, uptr bp, CHECK(size == 0 && trace[0] == pc); size = 1; uhwptr *frame = (uhwptr *)bp; - uhwptr *prev_frame = frame; - while (frame >= prev_frame && + uhwptr *prev_frame = frame - 1; + // Avoid infinite loop when frame == frame[0] by using frame > prev_frame. + while (frame > prev_frame && frame < (uhwptr *)stack_top - 2 && frame > (uhwptr *)stack_bottom && size < max_size) { -- 2.7.4