[Sanitizer] Try to fix infinite loop in frame pointer unwinder
authorReid Kleckner <reid@kleckner.net>
Wed, 20 Feb 2013 20:29:48 +0000 (20:29 +0000)
committerReid Kleckner <reid@kleckner.net>
Wed, 20 Feb 2013 20:29:48 +0000 (20:29 +0000)
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

index 639a69c..6309b23 100644 (file)
@@ -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) {