Commit 44d9e96d authored by Austin Clements's avatar Austin Clements

runtime: don't try to free OS-created signal stacks

Android's libc creates a signal stack for every thread it creates. In
Go, minitSignalStack picks up this existing signal stack and puts it
in m.gsignal.stack. However, if we later try to exit a thread (because
a locked goroutine is exiting), we'll attempt to stackfree this
libc-allocated signal stack and panic.

Fix this by clearing gsignal.stack when we unminitSignals in such a
situation.

This should fix the Android build, which is currently broken.

Change-Id: Ieea8d72ef063d22741c54c9daddd8bb84926a488
Reviewed-on: https://go-review.googlesource.com/70130Reviewed-by: default avatarDavid Crawshaw <crawshaw@golang.org>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent a3e013b0
......@@ -1268,7 +1268,13 @@ func mexit(osStack bool) {
unminit()
// Free the gsignal stack.
if m.gsignal != nil {
//
// If the signal stack was created outside Go, then gsignal
// will be non-nil, but unminitSignals set stack.lo to 0
// (e.g., Android's libc creates all threads with a signal
// stack, so it's possible for Go to exit them but not control
// the signal stack).
if m.gsignal != nil && m.gsignal.stack.lo != 0 {
stackfree(m.gsignal.stack)
}
......
......@@ -744,6 +744,10 @@ func unminitSignals() {
if getg().m.newSigstack {
st := stackt{ss_flags: _SS_DISABLE}
sigaltstack(&st, nil)
} else {
// We got the signal stack from someone else. Clear it
// so we don't get confused.
getg().m.gsignal.stack = stack{}
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment