diff options
| author | Austin Clements <austin@google.com> | 2017-10-11 17:04:26 -0400 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2017-10-11 22:17:30 +0000 |
| commit | 44d9e96da9b7625be81f2c7eacf73fcc609874ce (patch) | |
| tree | 2256e99a46d54e62a83e5bdd22a44f2dead62509 /src/runtime/proc.go | |
| parent | a3e013b0824ba53168b5d91abdb6ce191510a89d (diff) | |
| download | go-44d9e96da9b7625be81f2c7eacf73fcc609874ce.tar.xz | |
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/70130
Reviewed-by: David Crawshaw <crawshaw@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/proc.go')
| -rw-r--r-- | src/runtime/proc.go | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 165b04eb43..d096df547e 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -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) } |
