mirror of
https://github.com/golang/go
synced 2024-11-19 17:14:44 -07:00
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
This commit is contained in:
parent
d94bf76239
commit
820dc9ff1a
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user