mirror of
https://github.com/fluencelabs/musl
synced 2025-05-22 20:21:32 +00:00
fix fclose of permanent (stdin/out/err) streams
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.
This commit is contained in:
parent
d8be1bc019
commit
426a0e2912
@ -9,7 +9,7 @@ int fclose(FILE *f)
|
|||||||
int r;
|
int r;
|
||||||
int perm;
|
int perm;
|
||||||
|
|
||||||
FFINALLOCK(f);
|
FLOCK(f);
|
||||||
|
|
||||||
__unlist_locked_file(f);
|
__unlist_locked_file(f);
|
||||||
|
|
||||||
@ -26,6 +26,7 @@ int fclose(FILE *f)
|
|||||||
|
|
||||||
if (f->getln_buf) free(f->getln_buf);
|
if (f->getln_buf) free(f->getln_buf);
|
||||||
if (!perm) free(f);
|
if (!perm) free(f);
|
||||||
|
else FUNLOCK(f);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user