From 426a0e2912c07f0e86feee2ed12f24a808eac2f4 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Wed, 9 Sep 2015 04:31:07 +0000 Subject: fix fclose of permanent (stdin/out/err) streams MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit this fixes a bug reported by Nuno Gonçalves. previously, calling fclose on stdin or stdout resulted in deadlock at exit time, since __stdio_exit attempts to lock these streams to flush/seek them, and has no easy way of knowing that they were closed. conceptually, leaving a FILE stream locked on fclose is valid since, in the abstract machine, it ceases to exist. but to satisfy the implementation-internal assumption in __stdio_exit that it can access these streams unconditionally, we need to unlock them. it's also necessary that fclose leaves permanent streams in a state where __stdio_exit will not attempt any further operations on them. fortunately, the call to fflush already yields this property. --- src/stdio/fclose.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/stdio/fclose.c b/src/stdio/fclose.c index 839d88af..d687a877 100644 --- a/src/stdio/fclose.c +++ b/src/stdio/fclose.c @@ -9,7 +9,7 @@ int fclose(FILE *f) int r; int perm; - FFINALLOCK(f); + FLOCK(f); __unlist_locked_file(f); @@ -26,6 +26,7 @@ int fclose(FILE *f) if (f->getln_buf) free(f->getln_buf); if (!perm) free(f); - + else FUNLOCK(f); + return r; } -- cgit v1.2.1