Commit 3d1c3e1e authored by Keith Randall's avatar Keith Randall

runtime: stack copier should handle nil defers without faulting.

fixes #8047

LGTM=rsc
R=golang-codereviews, rsc
CC=golang-codereviews
https://golang.org/cl/101800043
parent bd401bae
...@@ -344,6 +344,8 @@ copyabletopsegment(G *gp) ...@@ -344,6 +344,8 @@ copyabletopsegment(G *gp)
if(d->argp < cinfo.stk || cinfo.base <= d->argp) if(d->argp < cinfo.stk || cinfo.base <= d->argp)
break; // a defer for the next segment break; // a defer for the next segment
fn = d->fn; fn = d->fn;
if(fn == nil) // See issue 8047
continue;
f = runtime·findfunc((uintptr)fn->fn); f = runtime·findfunc((uintptr)fn->fn);
if(f == nil) if(f == nil)
return -1; return -1;
...@@ -552,13 +554,19 @@ adjustdefers(G *gp, AdjustInfo *adjinfo) ...@@ -552,13 +554,19 @@ adjustdefers(G *gp, AdjustInfo *adjinfo)
} }
if(d->argp < adjinfo->oldstk || adjinfo->oldbase <= d->argp) if(d->argp < adjinfo->oldstk || adjinfo->oldbase <= d->argp)
break; // a defer for the next segment break; // a defer for the next segment
f = runtime·findfunc((uintptr)d->fn->fn); fn = d->fn;
if(fn == nil) {
// Defer of nil function. It will panic when run, and there
// aren't any args to adjust. See issue 8047.
d->argp += adjinfo->delta;
continue;
}
f = runtime·findfunc((uintptr)fn->fn);
if(f == nil) if(f == nil)
runtime·throw("can't adjust unknown defer"); runtime·throw("can't adjust unknown defer");
if(StackDebug >= 4) if(StackDebug >= 4)
runtime·printf(" checking defer %s\n", runtime·funcname(f)); runtime·printf(" checking defer %s\n", runtime·funcname(f));
// Defer's FuncVal might be on the stack // Defer's FuncVal might be on the stack
fn = d->fn;
if(adjinfo->oldstk <= (byte*)fn && (byte*)fn < adjinfo->oldbase) { if(adjinfo->oldstk <= (byte*)fn && (byte*)fn < adjinfo->oldbase) {
if(StackDebug >= 3) if(StackDebug >= 3)
runtime·printf(" adjust defer fn %s\n", runtime·funcname(f)); runtime·printf(" adjust defer fn %s\n", runtime·funcname(f));
......
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