From 844806cb1947b92ead65ec152cfa73334918728b Mon Sep 17 00:00:00 2001
From: florian <florian@freepascal.org>
Date: Tue, 25 Jun 2013 19:46:08 +0000
Subject: [PATCH] * renamed parameter bp (x86 ism) into fp for dump_stack *
 more sanity checks if fp really points into the stack

git-svn-id: trunk@24975 -
---
 rtl/inc/system.inc  | 18 ++++++++++--------
 rtl/inc/systemh.inc |  2 +-
 2 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/rtl/inc/system.inc b/rtl/inc/system.inc
index a7c6ccc025..9e1de943c8 100644
--- a/rtl/inc/system.inc
+++ b/rtl/inc/system.inc
@@ -1135,10 +1135,10 @@ begin
 end;
 
 
-Procedure dump_stack(var f : text;bp,addr : Pointer);
+Procedure dump_stack(var f : text;fp,addr : Pointer);
 var
   i : Longint;
-  prevbp : Pointer;
+  prevfp : Pointer;
   prevaddr : pointer;
   is_dev : boolean;
   caller_frame,
@@ -1147,14 +1147,16 @@ Begin
 {$ifdef FPC_HAS_FEATURE_EXCEPTIONS}
   try
 {$endif FPC_HAS_FEATURE_EXCEPTIONS}
-    prevbp:=bp-1;
+    prevfp:=fp-1;
     prevaddr:=nil;
     i:=0;
     is_dev:=do_isdevice(textrec(f).Handle);
-    while bp > prevbp Do
+    { sanity checks, new frame pointer must be always greater than the old one, further
+      it must point into the stack area, else something went wrong }
+    while (fp>prevfp) and (fp<StackTop) and (fp>StackBottom)  Do
      Begin
-       caller_addr := get_caller_addr(bp,addr);
-       caller_frame := get_caller_frame(bp,addr);
+       caller_addr := get_caller_addr(fp,addr);
+       caller_frame := get_caller_frame(fp,addr);
        if (caller_addr=nil) then
          break;
        Writeln(f,BackTraceStrFunc(caller_addr));
@@ -1163,9 +1165,9 @@ Begin
        Inc(i);
        If ((i>max_frame_dump) and is_dev) or (i>256) Then
          break;
-       prevbp:=bp;
+       prevfp:=fp;
        prevaddr:=addr;
-       bp:=caller_frame;
+       fp:=caller_frame;
        addr:=caller_addr;
      End;
 {$ifdef FPC_HAS_FEATURE_EXCEPTIONS}
diff --git a/rtl/inc/systemh.inc b/rtl/inc/systemh.inc
index b0dd64c2d9..fb83798478 100644
--- a/rtl/inc/systemh.inc
+++ b/rtl/inc/systemh.inc
@@ -1270,7 +1270,7 @@ Function  Paramcount:Longint;
 Function  ParamStr(l:Longint):string;
 {$endif FPC_HAS_FEATURE_COMMANDARGS}
 
-Procedure Dump_Stack(var f : text;bp:pointer;addr : pointer = nil);
+Procedure Dump_Stack(var f : text;fp:pointer;addr : pointer = nil);
 {$ifdef FPC_HAS_FEATURE_EXCEPTIONS}
 procedure DumpExceptionBackTrace(var f:text);
 {$endif FPC_HAS_FEATURE_EXCEPTIONS}