Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: [BUG] Misplaced quote in %d printf format crashes Zsh
- X-seq: zsh-workers 52951
- From: Jun T <takimoto-j@xxxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxx
- Subject: Re: [BUG] Misplaced quote in %d printf format crashes Zsh
- Date: Tue, 11 Jun 2024 11:24:08 +0900
- Archived-at: <https://zsh.org/workers/52951>
- In-reply-to: <CAA=-s3wETNCz5gc7+v0RMxSMzKe9-ogoK-ferwV7XV8G87wUJw@mail.gmail.com>
- List-id: <zsh-workers.zsh.org>
- References: <CAGdYchthV3bb7mid0epuHdCVm+4mYFKSLRP9qkFH8j=5y6w7cg@mail.gmail.com> <CAA=-s3zJ4FuuzmYCSApi9ghK5uvJdY8WKa1Ah0ZwEPBB+pRz8Q@mail.gmail.com> <CAA=-s3wETNCz5gc7+v0RMxSMzKe9-ogoK-ferwV7XV8G87wUJw@mail.gmail.com>
> 2024/06/09 9:23, Mark J. Reed <markjreed@xxxxxxxxx> wrote:
>
> Duplicated on my Macs; /bin/zsh (5.9) exhibits the crash on both x86_64 and ARM (M2).
>
> My locally-built 5.9.0.1-dev does not exhibit the symptom. To see if it was a build thing or the result of a code change, I checked out the zsh-5.9 tag and built that... and it also did not crash. So it seems to be something about Apple's build environment.
Which version of macOS are you using?
I tested on Ventura (13.6.3) and got the same crash with my local build
of both zsh-5.9 and the current git HEAD.
Valgrind (on Linux) tells me that the memory allocated at line 4877 in
builtin.c is lost:
ASSIGN_MSTREAM(buf,fout);
free(buf) _is_ called at line 5863, but it seems we need fclose(fout)
before freeing the memory. But the macro CLOSE_CLEANLY(fout) does not close
fout since CLOSE_FOUT() does nothing if HAVE_OPEN_MEMSTREAM is defined.
As the comment /* Why do we care about a clean close here? */ suggests,
I guess we can simply close fout if it is not stdout, just like lines
5228, 5265, 5299.
diff --git a/Src/builtin.c b/Src/builtin.c
index 7bfb1ce1d..cd0ee7522 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -5455,9 +5455,8 @@ bin_print(char *name, char **args, Options ops, int func)
}
zwarnnam(name, "%s: invalid directive", start);
if (*c) c[1] = save;
- /* Why do we care about a clean close here? */
- if (!CLOSE_CLEANLY(fout))
- zwarnnam(name, "write error: %e", errno);
+ if (fout != stdout)
+ fclose(fout);
#ifdef HAVE_OPEN_MEMSTREAM
if (buf)
free(buf);
--
Jun
Messages sorted by:
Reverse Date,
Date,
Thread,
Author