Currently, we're ignoring failures to mlock signal stacks in the
workaround for #35777. This means if your mlock limit is low, you'll
instead get random memory corruption, which seems like the wrong
trade-off.
This CL checks for mlock failures and panics with useful guidance.
Updates #35777.
Change-Id: I15f02d3a1fceade79f6ca717500ca5b86d5bd570
Reviewed-on: https://go-review.googlesource.com/c/go/+/210098
Run-TryBot: Austin Clements <austin@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
}
func mlockGsignal(gsignal *g) {
- mlock(gsignal.stack.hi-physPageSize, physPageSize)
+ if err := mlock(gsignal.stack.hi-physPageSize, physPageSize); err < 0 {
+ printlock()
+ println("runtime: mlock of signal stack failed:", -err)
+ if err == -_ENOMEM {
+ println("runtime: increase the mlock limit (ulimit -l) or")
+ }
+ println("runtime: update your kernel to 5.4.2 or later")
+ throw("mlock failed")
+ }
}