提交 426a0e29 编写于 作者: R Rich Felker

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.
上级 d8be1bc0
......@@ -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;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册