From: Bart Schaefer <schaefer@brasslantern.com>
To: Zsh hackers list <zsh-workers@zsh.org>
Subject: [PATCH] Improve stdio management when redirecting descriptors
Date: Sun, 28 Jan 2024 17:06:24 -0800 [thread overview]
Message-ID: <CAH+w=7bO-RrCG+TOLsA=2HH=GTzreZG0M4JSJAMX+EoQ7p6DTg@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 116 bytes --]
The attached patch assures that we're properly managing the internals
of FILE objects when performing redirections.
[-- Attachment #2: dup-purge.txt --]
[-- Type: text/plain, Size: 1453 bytes --]
diff --git a/Src/utils.c b/Src/utils.c
index 1a4f4c14b..0fda92709 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -2008,6 +2008,28 @@ redup(int x, int y)
{
int ret = y;
+#ifdef HAVE_FPURGE
+ /* Make sure buffers are cleared when changing descriptor for a
+ * FILE object. No fflush() here because the only way anything
+ * can legitimately be left in the buffer is when an error has
+ * occurred, so attempting flush here would at best error again
+ * and at worst squirt out something unexpected.
+ */
+ if (stdout && y == fileno(stdout))
+ fpurge(stdout);
+ if (stderr && y == fileno(stderr))
+ fpurge(stderr);
+ if (shout && y == fileno(shout))
+ fpurge(shout);
+ if (xtrerr && y == fileno(xtrerr))
+ fpurge(xtrerr);
+#ifndef _IONBF
+ /* See init.c setupshin() -- stdin otherwise unbuffered */
+ if (stdin && y == fileno(stdin))
+ fpurge(stdin);
+#endif
+#endif
+
if(x < 0)
zclose(y);
else if (x != y) {
diff --git a/configure.ac b/configure.ac
index 2871dcb7c..175d90433 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1295,7 +1295,7 @@ AC_CHECK_FUNCS(strftime strptime mktime timelocal \
select poll \
readlink faccessx fchdir ftruncate \
fstat lstat lchown fchown fchmod \
- fseeko ftello \
+ fpurge fseeko ftello \
mkfifo _mktemp mkstemp \
waitpid wait3 \
sigaction sigblock sighold sigrelse sigsetmask sigprocmask \
next reply other threads:[~2024-01-29 1:07 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-29 1:06 Bart Schaefer [this message]
2024-01-29 10:59 ` Mikael Magnusson
2024-01-29 13:03 ` Bart Schaefer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAH+w=7bO-RrCG+TOLsA=2HH=GTzreZG0M4JSJAMX+EoQ7p6DTg@mail.gmail.com' \
--to=schaefer@brasslantern.com \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).