]> Cypherpunks repositories - gostls13.git/commitdiff
Fix stack on FreeBSD / add stack check across the board
authorDevon H. O'Dell <devon.odell@gmail.com>
Wed, 9 Dec 2009 02:19:30 +0000 (18:19 -0800)
committerRuss Cox <rsc@golang.org>
Wed, 9 Dec 2009 02:19:30 +0000 (18:19 -0800)
FreeBSD was passing stk as the new thread's stack base, while
stk is the top of the stack in go. The added check should cause
a trap if this ever comes up in any new ports, or regresses
in current ones.

R=rsc
CC=golang-dev
https://golang.org/cl/167055

src/pkg/runtime/386/asm.s
src/pkg/runtime/amd64/asm.s
src/pkg/runtime/darwin/386/sys.s
src/pkg/runtime/freebsd/386/sys.s
src/pkg/runtime/freebsd/amd64/sys.s
src/pkg/runtime/freebsd/thread.c
src/pkg/runtime/linux/386/sys.s
src/pkg/runtime/linux/amd64/sys.s

index bd88f0fdc5a964437501d4c2733739938c4da735..7ec62161d93d3f5cf7178ebd1aeba63eaf0a0ccf 100644 (file)
@@ -323,6 +323,17 @@ TEXT       runcgo(SB),7,$16
        MOVL    4(SP), SP
        RET
 
+// check that SP is in range [g->stackbase, g->stackguard)
+TEXT stackcheck(SB), 7, $0
+       MOVL g, AX
+       CMPL g_stackbase(AX), SP
+       JHI 2(PC)
+       INT $3
+       CMPL SP, g_stackguard(AX)
+       JHI 2(PC)
+       INT $3
+       RET
+
 
 GLOBL m0(SB), $1024
 GLOBL g0(SB), $1024
index aee4e9a3f74936785d1af5beab18bb1524081850..3bd63ad15b164bd5154807122915674f6ac6754b 100644 (file)
@@ -301,3 +301,13 @@ TEXT runcgo(SB),7,$32
        MOVQ    8(SP), SP
        RET
 
+// check that SP is in range [g->stackbase, g->stackguard)
+TEXT stackcheck(SB), 7, $0
+       CMPQ g_stackbase(g), SP
+       JHI 2(PC)
+       INT $3
+       CMPQ SP, g_stackguard(g)
+       JHI 2(PC)
+       INT $3
+       RET
+
index 445f5300288d4ba6026fc88a81a082e08f8f1e47..38459447f89cb83810de62938046e65c2923598c 100644 (file)
@@ -153,6 +153,7 @@ TEXT bsdthread_start(SB),7,$0
        MOVL    AX, g
        MOVL    DX, m
        MOVL    BX, m_procid(DX)        // m->procid = thread port (for debuggers)
+       CALL    stackcheck(SB)          // smashes AX
        CALL    CX      // fn()
        CALL    exit1(SB)
        RET
index 1c0eaead5b08e9763bdaadcbe5d3d77ab5108d43..651ccb2348dedb559df57e28cfe707ff5148d209 100644 (file)
@@ -9,13 +9,13 @@
 #include "386/asm.h"
        
 TEXT sys_umtx_op(SB),7,$-4
-       MOVL $454, AX
-       INT $0x80
+       MOVL    $454, AX
+       INT     $0x80
        RET
 
 TEXT thr_new(SB),7,$-4
-       MOVL $455, AX
-       INT $0x80
+       MOVL    $455, AX
+       INT     $0x80
        RET
 
 TEXT thr_start(SB),7,$0
@@ -33,10 +33,11 @@ TEXT thr_start(SB),7,$0
        POPL    AX
        POPL    AX
        POPAL
-       MOVL BX, g
-       MOVL AX, m
-       CALL mstart(SB)
-       MOVL 0, AX                      // crash (not reached)
+       MOVL    BX, g
+       MOVL    AX, m
+       CALL    stackcheck(SB)          // smashes AX
+       CALL    mstart(SB)
+       MOVL    0, AX                   // crash (not reached)
 
 // Exit the entire program (like C exit)
 TEXT exit(SB),7,$-4
index 1b6246810513717488f45d452d962621bd079b8f..30184e297c1639a0c5a2aa758b1c5389a8fa59fa 100644 (file)
@@ -28,6 +28,7 @@ TEXT thr_new(SB),7,$0
 TEXT thr_start(SB),7,$0
        MOVQ DI, m
        MOVQ m_g0(m), g
+       CALL stackcheck(SB)
        CALL mstart(SB)
        MOVQ 0, AX                      // crash (not reached)
 
index 5f440223651d0eb3b90d9d68432845917e6916b4..bf891e9804640babd289dbc57ea8e87d013f7d44 100644 (file)
@@ -139,8 +139,8 @@ newosproc(M *m, G *g, void *stk, void (*fn)(void))
 
        param.start_func = thr_start;
        param.arg = m;
-       param.stack_base = stk;
-       param.stack_size = g->stackbase - g->stackguard + 256;
+       param.stack_base = (int8*)g->stackbase;
+       param.stack_size = (byte*)stk - (byte*)g->stackbase;
        param.child_tid = (intptr*)&m->procid;
        param.parent_tid = nil;
        param.tls_base = (int8*)&m->tls[0];
index 097dfe91559bb180cde4bc292c5498b162b27bef..72882cb9dccbdd3cf6ec4100bfc4db3ae150d1cc 100644 (file)
@@ -152,6 +152,7 @@ TEXT clone(SB),7,$0
        MOVL    DX, g
        MOVL    BX, m
 
+       CALL    stackcheck(SB)  // smashes AX
        MOVL    0(DX), DX       // paranoia; check they are not nil
        MOVL    0(BX), BX
 
index 238a423b13a25854cb506406d8b7ebe3d0386f30..6565d86de2a25d48ab48cf8f71bbf4fc9f0f7b50 100644 (file)
@@ -149,6 +149,7 @@ TEXT clone(SB),7,$0
        MOVQ    SI, SP
        MOVQ    R8, m
        MOVQ    R9, g
+       CALL    stackcheck(SB)
 
        // Initialize m->procid to Linux tid
        MOVL    $186, AX        // gettid