From: Russ Cox Date: Sun, 19 Feb 2012 16:05:19 +0000 (-0500) Subject: runtime: fix another memory leak X-Git-Tag: weekly.2012-02-22~104 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8a4c2b3cc45edb4a263c775683947709e9b4c50d;p=gostls13.git runtime: fix another memory leak morebuf holds a pc/sp from the last stack split or reflect.call or panic/recover. If the pc is a closure, the reference will keep it from being collected. moreargp holds a pointer to the arguments from the last stack split or reflect.call or panic/recover. Normally it is a stack pointer and thus not of interest, but in the case of reflect.call it is an allocated argument list and holds up the arguments to the call. R=golang-dev, r CC=golang-dev https://golang.org/cl/5674109 --- diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index eaec093c85..d09f075327 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -1103,6 +1103,9 @@ runtime·newstack(void) top->argp = m->moreargp; top->argsize = argsize; top->free = free; + m->moreargp = nil; + m->morebuf.pc = nil; + m->morebuf.sp = nil; // copy flag from panic top->panic = g1->ispanic; @@ -1114,7 +1117,7 @@ runtime·newstack(void) sp = (byte*)top; if(argsize > 0) { sp -= argsize; - runtime·memmove(sp, m->moreargp, argsize); + runtime·memmove(sp, top->argp, argsize); } if(thechar == '5') { // caller would have saved its LR below args.