threads/79887: [patch] freopen() isn't thread-safe
John Baldwin
jhb at freebsd.org
Tue Dec 7 14:40:14 UTC 2010
The following reply was made to PR threads/79887; it has been noted by GNATS.
From: John Baldwin <jhb at freebsd.org>
To: bug-followup at freebsd.org,
tejblum at yandex-team.ru
Cc: David Xu <davidxu at freebsd.org>
Subject: Re: threads/79887: [patch] freopen() isn't thread-safe
Date: Tue, 7 Dec 2010 09:31:36 -0500
David,
I think the submitter's analysis is correct that the only place that can set
the close function pointer is funopen() and that for that case (and any other
"fake" files), the file descriptor will be -1. If the fd is >= 0, then it
must be a file-descriptor-backed FILE, and relying on dup2() to close the fd
is ok.
As the manpage notes, the most common usage is to redirect stderr or stdout by
doing 'freopen("/dev/null", "w", stderr)'. The bug allows some other random
code that is calling open() in another thread to have that open() return 2
during the window where fd '2' is closed during freopen(). That other file
descriptor then gets trounced by the dup2() call in freopen() to point to
something else.
The code likely uses _close() rather than close() directly to be cleaner.
Given that this is stdio, I don't think we are really worried about the
performance impact of one extra wrapper function.
I think the original patch is most likely correct.
--
John Baldwin
More information about the freebsd-threads
mailing list