In order to avoid closing standard streams multiple times, commit 52aa1a661 (include/closestream: avoid close more than once, 2019-06-13) started to set the standard output and error streams to `NULL`. According to ISO C89, being able to assign to the standard text streams is not a requirement for any C implementation. See footnote 238 in chapter §7.19.5.6: The primary use of the freopen function is to change the file associated with a standard text stream (stderr, stdin, or stdout), as those identifiers need not be modifiable lvalues to which the value returned by the fopen function may be assigned. Fix the issue by instead using a local static variable `streams_closed` that gets set to `1` when the standard streams have been closed. This unbreaks compilation on musl libc systems. Signed-off-by: Patrick Steinhardt <ps@xxxxxx> --- lib/closestream.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/closestream.c b/lib/closestream.c index d735e4f01..e5d04fe69 100644 --- a/lib/closestream.c +++ b/lib/closestream.c @@ -19,6 +19,8 @@ # define CLOSE_EXIT_CODE EXIT_FAILURE #endif +static int streams_closed = 0; + int close_stream(FILE * stream) { @@ -44,7 +46,7 @@ close_stream(FILE * stream) static inline void close_stdout(void) { - if (stdout && close_stream(stdout) != 0 && !(errno == EPIPE)) { + if (!streams_closed && close_stream(stdout) != 0 && !(errno == EPIPE)) { if (errno) warn(_("write error")); else @@ -52,11 +54,10 @@ close_stdout(void) _exit(CLOSE_EXIT_CODE); } - if (stderr && close_stream(stderr) != 0) + if (!streams_closed && close_stream(stderr) != 0) _exit(CLOSE_EXIT_CODE); - stdout = NULL; - stderr = NULL; + streams_closed = 1; } void close_stdout_atexit(void) -- 2.22.1