diff options
author | Carl Shapiro <cshapiro@google.com> | 2013-03-26 11:43:09 -0700 |
---|---|---|
committer | Carl Shapiro <cshapiro@google.com> | 2013-03-26 11:43:09 -0700 |
commit | 23c3457500ac5dcc6516dd90b05396842f5762ed (patch) | |
tree | c157927768d88dc43bf5e1a11297dafbead72466 /src/pkg/runtime/traceback_arm.c | |
parent | 5767d869ccf1aa6fe4305f1c822e5897d2cfc487 (diff) | |
download | go-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.c | 5 |
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) |