summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog2
-rw-r--r--Src/builtin.c18
2 files changed, 19 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 3bef21a02..cca917efe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,8 @@
* 34488: Src/builtin.c: Fix use-after-free for print -zf and
print -sf
+ * 34490: Src/builtin.c: Fix leak on print -zf/-sf error
+
2015-02-09 Peter Stephenson <p.stephenson@samsung.com>
* 34485: Src/exec.c, Src/parse.c, Test/E01options.ztst:
diff --git a/Src/builtin.c b/Src/builtin.c
index e093cbe32..c4e4b94fd 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -3732,7 +3732,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
@@ -4214,6 +4214,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;
@@ -4247,6 +4251,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;
@@ -4276,6 +4284,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;
@@ -4431,6 +4443,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;
}