1
0
mirror of https://github.com/golang/go synced 2024-11-22 02:44:39 -07:00

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 #5124

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/8023043
This commit is contained in:
Carl Shapiro 2013-03-26 11:43:09 -07:00
parent 7cfebf7b1d
commit 8480e6f476
2 changed files with 4 additions and 10 deletions

View File

@ -160,9 +160,7 @@ func testCallbackCallers(t *testing.T) {
nestedCall(func() {
n = runtime.Callers(2, pc)
})
// The ARM cannot unwind all the way down to runtime.goexit.
// See issue 5124.
if n != len(name) && runtime.GOARCH != "arm" {
if n != len(name) {
t.Errorf("expected %d frames, got %d", len(name), n)
}
for i := 0; i < n; i++ {
@ -179,10 +177,5 @@ func testCallbackCallers(t *testing.T) {
if fname != name[i] {
t.Errorf("expected function name %s, got %s", name[i], fname)
}
// The ARM cannot unwind frames past runtime.cgocall.
// See issue 5124.
if runtime.GOARCH == "arm" && i == 4 {
break
}
}
}

View File

@ -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)