diff options
| author | Cherry Zhang <cherryyz@google.com> | 2019-02-09 23:31:59 -0500 |
|---|---|---|
| committer | Cherry Zhang <cherryyz@google.com> | 2019-02-13 15:49:22 +0000 |
| commit | af8f4062c24cb36af4dc24fbaffd23aa7f7bde36 (patch) | |
| tree | 9b3c719fea5208f3acb4a402790f1c551247b09e /src/runtime/runtime1.go | |
| parent | ffd096db2b1cff6399eb1f86e5652564ee8ee362 (diff) | |
| download | go-af8f4062c24cb36af4dc24fbaffd23aa7f7bde36.tar.xz | |
runtime: scan gp._panic in stack scan
In runtime.gopanic, the _panic object p is stack allocated and
referenced from gp._panic. With stack objects, p on stack is dead
at the point preprintpanics runs. gp._panic points to p, but
stack scan doesn't look at gp. Heap scan of gp does look at
gp._panic, but it stops and ignores the pointer as it points to
the stack. So whatever p points to may be collected and clobbered.
We need to scan gp._panic explicitly during stack scan.
To test it reliably, we introduce a GODEBUG mode "clobberfree",
which clobbers the memory content when the GC frees an object.
Fixes #30150.
Change-Id: I11128298f03a89f817faa221421a9d332b41dced
Reviewed-on: https://go-review.googlesource.com/c/161778
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/runtime/runtime1.go')
| -rw-r--r-- | src/runtime/runtime1.go | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/runtime/runtime1.go b/src/runtime/runtime1.go index c5667e73ad..0c0a31ee6a 100644 --- a/src/runtime/runtime1.go +++ b/src/runtime/runtime1.go @@ -301,6 +301,7 @@ type dbgVar struct { var debug struct { allocfreetrace int32 cgocheck int32 + clobberfree int32 efence int32 gccheckmark int32 gcpacertrace int32 @@ -318,6 +319,7 @@ var debug struct { var dbgvars = []dbgVar{ {"allocfreetrace", &debug.allocfreetrace}, + {"clobberfree", &debug.clobberfree}, {"cgocheck", &debug.cgocheck}, {"efence", &debug.efence}, {"gccheckmark", &debug.gccheckmark}, |
