From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10025 invoked by alias); 3 Dec 2010 23:20:32 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 28469 Received: (qmail 25036 invoked from network); 3 Dec 2010 23:20:21 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received-SPF: pass (ns1.primenet.com.au: SPF record at ntlworld.com designates 81.103.221.48 as permitted sender) From: Peter Stephenson To: zsh-workers@zsh.org (Zsh hackers list) Subject: PATCH: memory leak in anonoymous functions X-Mailer: MH-E 8.2; nmh 1.3; GNU Emacs 23.2.1 Date: Fri, 03 Dec 2010 23:20:08 +0000 Message-ID: <13070.1291418408@pws-pc.ntlworld.com> X-Cloudmark-Analysis: v=1.1 cv=X0sWjjQ37bMP4yB/pNNinY3VxVB2n/hmdAjhihaCFGs= c=1 sm=0 a=W2xkN0fkgP4A:10 a=NLZqzBF-AAAA:8 a=CQ_mExn-HwxrcQSzX2sA:9 a=5vKbXm0c49IWU6kGuAQA:7 a=ggaAAgGROqZbZra2BdgZsRa2uG0A:4 a=_dQi-Dcv4p4A:10 a=HpAAvcLHHh0Zw7uRqdWCyQ==:117 Found by valgrind. It's reporting lots of possible leaks, but they're very hard to track down. For example, save = (!(state->prog->flags & EF_HEAP) && !strcmp(opat, right) && pprog != dummy_patprog2); if (!(pprog = patcompile(right, (save ? PAT_ZDUP : PAT_STATIC), NULL))) { zwarnnam(fromtest, "bad pattern: %s", right); return 2; } else if (save) state->prog->pats[npat] = pprog; That pprog might be leaked, it says. Er, yeah, right. It's also very suspicious of parameters, particularly complicated uses like tied parameters and autoloaded parameters. Index: Src/exec.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/exec.c,v retrieving revision 1.185 diff -p -u -r1.185 exec.c --- Src/exec.c 27 Nov 2010 19:46:32 -0000 1.185 +++ Src/exec.c 3 Dec 2010 23:14:32 -0000 @@ -4159,6 +4159,10 @@ execfuncdef(Estate state, UNUSED(int do_ execshfunc(shf, args); ret = lastval; + + freeeprog(shf->funcdef); + zsfree(shf->filename); + zfree(shf, sizeof(*shf)); break; } else { /* is this shell function a signal trap? */ -- Peter Stephenson Web page now at http://homepage.ntlworld.com/p.w.stephenson/