From 63c6d1746c5bbe67a4f78517b3a0f532d50672f6 Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Sat, 2 Jan 2016 13:57:35 -0800 Subject: 37497: handle NUL bytes in "printf -v". --- Src/builtin.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'Src/builtin.c') diff --git a/Src/builtin.c b/Src/builtin.c index 557487c87..04d8f11d9 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -4872,17 +4872,20 @@ bin_print(char *name, char **args, Options ops, int func) if (OPT_ISSET(ops,'z') || OPT_ISSET(ops,'s') || OPT_ISSET(ops,'v')) { #ifdef HAVE_OPEN_MEMSTREAM - putc(0, fout); + putc(0, fout); /* not needed? open_memstream() maintains? */ fclose(fout); fout = NULL; + rcount = mcount; /* now includes the trailing NUL we added */ #else rewind(fout); buf = (char *)zalloc(count + 1); - fread(buf, count, 1, fout); - buf[count] = '\0'; + rcount = fread(buf, count, 1, fout); + if (rcount < count) + zwarnnam(name, "i/o error: %e", errno); + buf[rcount] = '\0'; #endif queue_signals(); - stringval = metafy(buf, -1, META_REALLOC); + stringval = metafy(buf, rcount - 1, META_REALLOC); if (OPT_ISSET(ops,'z')) { zpushnode(bufstack, stringval); } else if (OPT_ISSET(ops,'v')) { -- cgit 1.4.1