1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
From 426a0e2912c07f0e86feee2ed12f24a808eac2f4 Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Wed, 9 Sep 2015 04:31:07 +0000
Subject: [PATCH] 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 839d88a..d687a87 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;
}
--
2.5.1
|