diff options
author | Austin Clements <austin@google.com> | 2017-01-11 11:32:40 -0500 |
---|---|---|
committer | Austin Clements <austin@google.com> | 2017-01-11 11:34:07 -0500 |
commit | 8b25a00e6d889c8a919922f747791478c8bdfe6f (patch) | |
tree | 6faa7aece11fb62a1afd3eb0bd7350440fb13244 /src/runtime/stack.go | |
parent | 42afbd9e63ed870c67d7c46b4ec38d4bae0e3e63 (diff) | |
parent | d9a05791566aa8d54113ac88ae77b982872f9be7 (diff) | |
download | go-git-8b25a00e6d889c8a919922f747791478c8bdfe6f.tar.gz |
Merge branch 'master' into dev.garbage
Change-Id: I36274cf72b8e1908efc8e375cab7880d7b0b3f43
Diffstat (limited to 'src/runtime/stack.go')
-rw-r--r-- | src/runtime/stack.go | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/runtime/stack.go b/src/runtime/stack.go index ea9a69aa1e..0f1a5c1c55 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -123,6 +123,9 @@ const ( stackPoisonCopy = 0 // fill stack that should not be accessed with garbage, to detect bad dereferences during copy stackCache = 1 + + // check the BP links during traceback. + debugCheckBP = false ) const ( @@ -598,7 +601,7 @@ func adjustpointers(scanp unsafe.Pointer, cbv *bitvector, adjinfo *adjustinfo, f pp := (*uintptr)(add(scanp, i*sys.PtrSize)) retry: p := *pp - if f != nil && 0 < p && p < _PageSize && debug.invalidptr != 0 { + if f != nil && 0 < p && p < minLegalPointer && debug.invalidptr != 0 { // Looks like a junk value in a pointer slot. // Live analysis wrong? getg().m.traceback = 2 @@ -688,6 +691,16 @@ func adjustframe(frame *stkframe, arg unsafe.Pointer) bool { if stackDebug >= 3 { print(" saved bp\n") } + if debugCheckBP { + // Frame pointers should always point to the next higher frame on + // the Go stack (or be nil, for the top frame on the stack). + bp := *(*uintptr)(unsafe.Pointer(frame.varp)) + if bp != 0 && (bp < adjinfo.old.lo || bp >= adjinfo.old.hi) { + println("runtime: found invalid frame pointer") + print("bp=", hex(bp), " min=", hex(adjinfo.old.lo), " max=", hex(adjinfo.old.hi), "\n") + throw("bad frame pointer") + } + } adjustpointer(adjinfo, unsafe.Pointer(frame.varp)) } @@ -719,6 +732,18 @@ func adjustframe(frame *stkframe, arg unsafe.Pointer) bool { func adjustctxt(gp *g, adjinfo *adjustinfo) { adjustpointer(adjinfo, unsafe.Pointer(&gp.sched.ctxt)) + if !framepointer_enabled { + return + } + if debugCheckBP { + bp := gp.sched.bp + if bp != 0 && (bp < adjinfo.old.lo || bp >= adjinfo.old.hi) { + println("runtime: found invalid top frame pointer") + print("bp=", hex(bp), " min=", hex(adjinfo.old.lo), " max=", hex(adjinfo.old.hi), "\n") + throw("bad top frame pointer") + } + } + adjustpointer(adjinfo, unsafe.Pointer(&gp.sched.bp)) } func adjustdefers(gp *g, adjinfo *adjustinfo) { |