1
0
mirror of https://github.com/golang/go synced 2024-11-23 16:00:06 -07:00

runtime: avoid read overrun in heapdump

Start the stack a few words below the actual top, so that
if something tries to read goexit's caller PC from the stack,
it won't fault on a bad memory address.
Today, heapdump does that.
Maybe tomorrow, traceback or something else will do that.
Make it not a bug.

TBR=khr
R=khr
CC=golang-codereviews
https://golang.org/cl/136450043
This commit is contained in:
Russ Cox 2014-09-09 15:38:55 -04:00
parent d33ee0c5e5
commit 16c59acb97

View File

@ -1047,6 +1047,7 @@ runtime·newextram(void)
gp = runtime·malg(4096); gp = runtime·malg(4096);
gp->sched.pc = (uintptr)runtime·goexit; gp->sched.pc = (uintptr)runtime·goexit;
gp->sched.sp = gp->stack.hi; gp->sched.sp = gp->stack.hi;
gp->sched.sp -= 4*sizeof(uintreg); // extra space in case of reads slightly beyond frame
gp->sched.lr = 0; gp->sched.lr = 0;
gp->sched.g = gp; gp->sched.g = gp;
gp->syscallpc = gp->sched.pc; gp->syscallpc = gp->sched.pc;
@ -2229,6 +2230,7 @@ runtime·newproc1(FuncVal *fn, byte *argp, int32 narg, int32 nret, void *callerp
runtime·throw("newproc1: new g is not Gdead"); runtime·throw("newproc1: new g is not Gdead");
sp = (byte*)newg->stack.hi; sp = (byte*)newg->stack.hi;
sp -= 4*sizeof(uintreg); // extra space in case of reads slightly beyond frame
sp -= siz; sp -= siz;
runtime·memmove(sp, argp, narg); runtime·memmove(sp, argp, narg);
if(thechar == '5') { if(thechar == '5') {