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:
parent
d33ee0c5e5
commit
16c59acb97
@ -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') {
|
||||||
|
Loading…
Reference in New Issue
Block a user