Commit 820dc9ff authored by Russ Cox's avatar Russ Cox

runtime: fix signal stack bug

In CL 4188061 I changed malg to allocate the requested
number of bytes n, not n+StackGuard, so that the
allocations would use rounder numbers.

The allocation of the signal stack asks for 32k and
then used g->stackguard as the base, but g->stackguard
is StackGuard bytes above the base.  Previously, asking
for 32k meant getting 32k+StackGuard bytes, so using
g->stackguard as the base was safe.  Now, the actual base
must be computed, so that the signal handler does not
run StackGuard bytes past the top of the stack.

Was causing flakiness mainly in programs that use the
network, because they sometimes write to closed network
connections, causing SIGPIPEs.  Was also causing problems
in the doc/progs test.

Also fix Makefile so that changes to stack.h trigger rebuild.

R=bradfitzgo, r, r2
CC=golang-dev
https://golang.org/cl/4230044
parent d94bf762
......@@ -176,11 +176,9 @@ _cgo_defun.$O: _cgo_defun.c
# Generic build rules.
# These come last so that the rules above can override them
# for more specific file names.
%.$O: %.c
%.$O: %.c $(HFILES)
$(CC) $(CFLAGS) $*.c
%.$O: %.s
$(AS) $*.s
%.$O: $(HFILES)
......@@ -94,6 +94,7 @@ HFILES=\
runtime.h\
hashmap.h\
malloc.h\
stack.h\
$(GOARCH)/asm.h\
$(GOOS)/os.h\
$(GOOS)/signals.h\
......@@ -141,13 +142,13 @@ version_$(GOOS).go:
./goc2c "`pwd`/$<" > $@.tmp
mv -f $@.tmp $@
%.$O: $(GOARCH)/%.c
%.$O: $(GOARCH)/%.c $(HFILES)
$(CC) $(CFLAGS) $<
%.$O: $(GOOS)/%.c
%.$O: $(GOOS)/%.c $(HFILES)
$(CC) $(CFLAGS) $<
%.$O: $(GOOS)/$(GOARCH)/%.c
%.$O: $(GOOS)/$(GOARCH)/%.c $(HFILES)
$(CC) $(CFLAGS) $<
%.$O: $(GOARCH)/%.s $(GOARCH)/asm.h
......
......@@ -5,6 +5,7 @@
#include "runtime.h"
#include "defs.h"
#include "os.h"
#include "stack.h"
extern SigTab runtime·sigtab[];
......@@ -176,7 +177,7 @@ runtime·minit(void)
{
// Initialize signal handling.
m->gsignal = runtime·malg(32*1024); // OS X wants >=8K, Linux >=2K
runtime·signalstack(m->gsignal->stackguard, 32*1024);
runtime·signalstack(m->gsignal->stackguard - StackGuard, 32*1024);
}
// Mach IPC, to get at semaphores
......
......@@ -4,6 +4,7 @@
#include "runtime.h"
#include "defs.h"
#include "os.h"
#include "stack.h"
extern SigTab runtime·sigtab[];
extern int32 runtime·sys_umtx_op(uint32*, int32, uint32, void*, void*);
......@@ -175,7 +176,7 @@ runtime·minit(void)
{
// Initialize signal handling
m->gsignal = runtime·malg(32*1024);
runtime·signalstack(m->gsignal->stackguard, 32*1024);
runtime·signalstack(m->gsignal->stackguard - StackGuard, 32*1024);
}
void
......
......@@ -5,6 +5,7 @@
#include "runtime.h"
#include "defs.h"
#include "os.h"
#include "stack.h"
extern SigTab runtime·sigtab[];
......@@ -274,7 +275,7 @@ runtime·minit(void)
{
// Initialize signal handling.
m->gsignal = runtime·malg(32*1024); // OS X wants >=8K, Linux >=2K
runtime·signalstack(m->gsignal->stackguard, 32*1024);
runtime·signalstack(m->gsignal->stackguard - StackGuard, 32*1024);
}
void
......
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