aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/stack.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/stack.go')
-rw-r--r--src/runtime/stack.go19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/runtime/stack.go b/src/runtime/stack.go
index c92accf188..d1c80276a5 100644
--- a/src/runtime/stack.go
+++ b/src/runtime/stack.go
@@ -8,6 +8,7 @@ import (
"internal/abi"
"internal/cpu"
"internal/goarch"
+ "internal/goexperiment"
"internal/goos"
"internal/runtime/atomic"
"internal/runtime/gc"
@@ -985,6 +986,16 @@ func copystack(gp *g, newsize uintptr) {
}
// free old stack
+ if goexperiment.RuntimeSecret && gp.secret > 0 {
+ // Some portion of the old stack has secret stuff on it.
+ // We don't really know where we entered secret mode,
+ // so just clear the whole thing.
+ // TODO(dmo): traceback until we hit secret.Do? clearing
+ // is fast and optimized, might not be worth it.
+ memclrNoHeapPointers(unsafe.Pointer(old.lo), old.hi-old.lo)
+ // The memmove call above might put secrets from the stack into registers.
+ secretEraseRegisters()
+ }
if stackPoisonCopy != 0 {
fillstack(old, 0xfc)
}
@@ -1026,6 +1037,14 @@ func newstack() {
}
gp := thisg.m.curg
+ if goexperiment.RuntimeSecret && gp.secret > 0 {
+ // If we're entering here from a secret context, clear
+ // all the registers. This is important because we
+ // might context switch to a different goroutine which
+ // is not in secret mode, and it will not be careful
+ // about clearing its registers.
+ secretEraseRegisters()
+ }
if thisg.m.curg.throwsplit {
// Update syscallsp, syscallpc in case traceback uses them.