diff --git a/ChangeLog b/ChangeLog index 7335590c9..6c52ccd22 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2024-01-28 Bart Schaefer + + * 52509: configure.ac, Src/utils.c: manage internals of stdio + objects when performing redirections. + 2024-01-28 Oliver Kiddle * 52500: Src/Zle/zle.h, Src/Zle/zle_refresh.c, Src/prompt.c: 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 \