summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/traceback_arm.c
diff options
context:
space:
mode:
authorCarl Shapiro <cshapiro@google.com>2013-03-26 11:43:09 -0700
committerCarl Shapiro <cshapiro@google.com>2013-03-26 11:43:09 -0700
commit23c3457500ac5dcc6516dd90b05396842f5762ed (patch)
treec157927768d88dc43bf5e1a11297dafbead72466 /src/pkg/runtime/traceback_arm.c
parent5767d869ccf1aa6fe4305f1c822e5897d2cfc487 (diff)
downloadgo-23c3457500ac5dcc6516dd90b05396842f5762ed.tar.gz
runtime: ensure forward progress when unwinding an arm stack frame
The arm gentraceback mishandled frame linkage values pointing to the assembly return function. This function is special as its frame size is zero and it contains only one instruction. These conditions would preserve the frame pointer and result in an off by one error when unwinding the caller. Fixes issue 5124 R=golang-dev, bradfitz CC=golang-dev https://codereview.appspot.com/8023043
Diffstat (limited to 'src/pkg/runtime/traceback_arm.c')
-rw-r--r--src/pkg/runtime/traceback_arm.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/pkg/runtime/traceback_arm.c b/src/pkg/runtime/traceback_arm.c
index dd85cc02c..9c351db60 100644
--- a/src/pkg/runtime/traceback_arm.c
+++ b/src/pkg/runtime/traceback_arm.c
@@ -74,8 +74,9 @@ runtime·gentraceback(byte *pc0, byte *sp, byte *lr0, G *gp, int32 skip, uintptr
lr = *(uintptr*)sp;
if(fp == nil) {
fp = sp;
- if(pc > f->entry && f->frame >= 0)
- fp += f->frame;
+ if(pc > f->entry && f->frame >= sizeof(uintptr))
+ fp += f->frame - sizeof(uintptr);
+ fp += sizeof(uintptr);
}
if(skip > 0)