From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6981 invoked by alias); 10 Feb 2015 07:18:11 -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: 34490 Received: (qmail 27976 invoked from network); 10 Feb 2015 07:18:10 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id; bh=2Im6KHann1YnbEtGQ/BQoNSjDleG12TKunx1fwXot8g=; b=ZsfcuSUmOt0MSqL8eiF7H7bwPKYSHqm+tvuLs4FveXKKpeDq7H7Jl2wHxRpfU7Kelw YacexIgo9UVpLM/sYvoFI6SMdt2zrDsshYoBd8OqROeYuP1ud1asoeCMRL6YFGzusGUb QoT5GATIVD9LHpnVjkdcm/lp5rLpIagFDG9n+1Dw7ACTtMVmB7IlYEj+/qpO6njoXqDj SJnkMMqIvXAxtEQw+6BqEswmW9O0g0C92Qz6PUwh5DqC7u7jOjTaDYh/FPWUguRLIZrf xtqHbv2DwoqqUMRcC8bXjxLX/oAvIfmBgZ5+cuVQOlbB57vhm06wfJa4zzTI0J+zpkMI TVeA== X-Received: by 10.180.221.73 with SMTP id qc9mr23418600wic.8.1423552364280; Mon, 09 Feb 2015 23:12:44 -0800 (PST) From: Mikael Magnusson To: zsh-workers@zsh.org Subject: PATCH: Fix leak on print -zf/-sf error Date: Tue, 10 Feb 2015 08:12:36 +0100 Message-Id: <1423552356-18878-1-git-send-email-mikachu@gmail.com> X-Mailer: git-send-email 2.2.0.GIT for ((i=0; i < 1000000; i++ )); do print -zf hi%\*3\$; done without the patch, this slowly grows in size, with the patch it doesn't. --- Src/builtin.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Src/builtin.c b/Src/builtin.c index e0f6a5c..eb63657 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -3731,7 +3731,7 @@ bin_print(char *name, char **args, Options ops, int func) int flen, width, prec, type, argc, n, narg, curlen = 0; int nnl = 0, fmttrunc = 0, ret = 0, maxarg = 0, nc = 0; int flags[5], *len; - char *start, *endptr, *c, *d, *flag, *buf, spec[13], *fmt = NULL; + char *start, *endptr, *c, *d, *flag, *buf = NULL, spec[13], *fmt = NULL; char **first, **argp, *curarg, *flagch = "0+- #", save = '\0', nullstr = '\0'; size_t rcount, count = 0; #ifdef HAVE_OPEN_MEMSTREAM @@ -4213,6 +4213,10 @@ bin_print(char *name, char **args, Options ops, int func) narg); if (fout != stdout) fclose(fout); +#ifdef HAVE_OPEN_MEMSTREAM + if (buf) + free(buf); +#endif return 1; } else { if (narg > maxarg) maxarg = narg; @@ -4246,6 +4250,10 @@ bin_print(char *name, char **args, Options ops, int func) narg); if (fout != stdout) fclose(fout); +#ifdef HAVE_OPEN_MEMSTREAM + if (buf) + free(buf); +#endif return 1; } else { if (narg > maxarg) maxarg = narg; @@ -4275,6 +4283,10 @@ bin_print(char *name, char **args, Options ops, int func) narg); if (fout != stdout) fclose(fout); +#ifdef HAVE_OPEN_MEMSTREAM + if (buf) + free(buf); +#endif return 1; } else { if (narg > maxarg) maxarg = narg; @@ -4430,6 +4442,10 @@ bin_print(char *name, char **args, Options ops, int func) (fflush(fout) != 0 && errno != EBADF)) { zwarnnam(name, "write error: %e", errno); } +#ifdef HAVE_OPEN_MEMSTREAM + if (buf) + free(buf); +#endif return 1; } -- 2.2.0.GIT