mirror of
https://github.com/golang/go
synced 2024-11-20 01:14:40 -07:00
4d1ab2d8d1
The problem is not actually specific to android/arm. Linux/ARM's runtime.clone set the stack pointer to child_stk-4 before calling the fn. And then when fn returns, it tries to write to 4(R13) to provide argument for runtime.exit, which is just beyond the allocated child stack, and thus it will corrupt the heap randomly or trigger segfault if that memory happens to be unmapped. While we're at here, shorten the test polling interval to 0.1s to speed up the test (it was only checking at 1s interval, which means the test takes at least 1s). Fixes #10548. Change-Id: I57cd63232022b113b6cd61e987b0684ebcce930a Reviewed-on: https://go-review.googlesource.com/9457 Reviewed-by: David Crawshaw <crawshaw@golang.org>
42 lines
890 B
Go
42 lines
890 B
Go
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// The file contains tests that can not run under race detector for some reason.
|
|
// +build !race
|
|
|
|
package runtime_test
|
|
|
|
import (
|
|
"runtime"
|
|
"testing"
|
|
"time"
|
|
"unsafe"
|
|
)
|
|
|
|
var newOSProcDone bool
|
|
|
|
//go:nosplit
|
|
func newOSProcCreated() {
|
|
newOSProcDone = true
|
|
}
|
|
|
|
// Can't be run with -race because it inserts calls into newOSProcCreated()
|
|
// that require a valid G/M.
|
|
func TestNewOSProc0(t *testing.T) {
|
|
runtime.NewOSProc0(0x800000, unsafe.Pointer(runtime.FuncPC(newOSProcCreated)))
|
|
check := time.NewTicker(100 * time.Millisecond)
|
|
defer check.Stop()
|
|
end := time.After(5 * time.Second)
|
|
for {
|
|
select {
|
|
case <-check.C:
|
|
if newOSProcDone {
|
|
return
|
|
}
|
|
case <-end:
|
|
t.Fatalf("couldn't create new OS process")
|
|
}
|
|
}
|
|
}
|