aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2015-08-26 15:06:43 -0400
committerChris Broadfoot <cbro@golang.org>2015-09-08 18:02:06 +0000
commitf265044a489c9e572ffc141ed2d0e95f05d451c9 (patch)
treeb87bbfe692e7a3521cfc96a244e1c3429a6bfc27
parentc0dd2011132f179e77f7f6e1ccd88b5a0e0ee659 (diff)
downloadgo-f265044a489c9e572ffc141ed2d0e95f05d451c9.tar.gz
go-f265044a489c9e572ffc141ed2d0e95f05d451c9.zip
[release-branch.go1.5] runtime: check that stack barrier unwind is in sync
Currently the stack barrier stub blindly unwinds the next stack barrier from the G's stack barrier array without checking that it's the right stack barrier. If through some bug the stack barrier array position gets out of sync with where we actually are on the stack, this could return to the wrong PC, which would lead to difficult to debug crashes. To address this, this commit adds a check to the amd64 stack barrier stub that it's unwinding the correct stack barrier. Updates #12238. Change-Id: If824d95191d07e2512dc5dba0d9978cfd9f54e02 Reviewed-on: https://go-review.googlesource.com/13948 Reviewed-by: Russ Cox <rsc@golang.org> Reviewed-on: https://go-review.googlesource.com/14241 Reviewed-by: Austin Clements <austin@google.com>
-rw-r--r--src/runtime/asm_amd64.s5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/runtime/asm_amd64.s b/src/runtime/asm_amd64.s
index 3b4ca4d012..b7bd3dd34f 100644
--- a/src/runtime/asm_amd64.s
+++ b/src/runtime/asm_amd64.s
@@ -346,7 +346,12 @@ TEXT runtime·stackBarrier(SB),NOSPLIT,$0
MOVQ (g_stkbar+slice_array)(CX), DX
MOVQ g_stkbarPos(CX), BX
IMULQ $stkbar__size, BX // Too big for SIB.
+ MOVQ stkbar_savedLRPtr(DX)(BX*1), R8
MOVQ stkbar_savedLRVal(DX)(BX*1), BX
+ // Assert that we're popping the right saved LR.
+ CMPQ R8, SP
+ JNE 2(PC)
+ MOVL $0, 0
// Record that this stack barrier was hit.
ADDQ $1, g_stkbarPos(CX)
// Jump to the original return PC.