]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: re-enable TestNewProc0 on android/arm and fix heap corruption
authorShenghou Ma <minux@golang.org>
Wed, 29 Apr 2015 06:42:43 +0000 (02:42 -0400)
committerMinux Ma <minux@golang.org>
Wed, 29 Apr 2015 19:18:07 +0000 (19:18 +0000)
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>
src/runtime/norace_linux_test.go
src/runtime/sys_linux_arm.s

index c355ccc0f82033d942ffc0a52c901101d134e48c..bbf9d0b41391401660dfb97d5fa34156cb57fe07 100644 (file)
@@ -24,13 +24,8 @@ func newOSProcCreated() {
 // Can't be run with -race because it inserts calls into newOSProcCreated()
 // that require a valid G/M.
 func TestNewOSProc0(t *testing.T) {
-       if runtime.GOOS == "android" && runtime.GOARCH == "arm" {
-               // newosproc0 does not work for android/arm.
-               // See issue 10548.
-               t.Skipf("skipping on %v", runtime.GOOS)
-       }
        runtime.NewOSProc0(0x800000, unsafe.Pointer(runtime.FuncPC(newOSProcCreated)))
-       check := time.NewTicker(1 * time.Second)
+       check := time.NewTicker(100 * time.Millisecond)
        defer check.Stop()
        end := time.After(5 * time.Second)
        for {
index 3936cd93a87e8e163d7c11f09197c9b9704f891b..50f074a234bc7d7aaef1ec1e2b4a8418f9a09d56 100644 (file)
@@ -308,6 +308,7 @@ nog:
        BL      (R0)
 
        // It shouldn't return.  If it does, exit that thread.
+       SUB     $16, R13 // restore the stack pointer to avoid memory corruption
        MOVW    $0, R0
        MOVW    R0, 4(R13)
        BL      runtime·exit1(SB)