On Sun, Jan 29, 2012 at 02:09:06PM +0400, Max Dmitrichenko wrote:
> Package: libc6
> Version: 2.11.3-2
> Severity: important
> 
> One thread of multithreaded application calls fork(). According to the POSIX
> standard only that thread which called fork() would present in the child
> process. But the state of all mutexes, condvars and other objects are copied
> into the child process "as is" and should be reinitialized.

True.

> A call for gmtime_r() from the user applications will lock internal libc lock
> __tzset_lock (defined in time/tzset.c). If one thread was calling gmtime_r()
> while another thread was calling fork(), this lock is copied into the child
> process in the locked state. So the first call of the child process for
> gmtime_r() will deadlock it. Apparently fork() implementation should have 
> reset
> the state of all internal mutexes in the child process before returning 
> control
> to it.
> 

gmtime_r() is not an async-signal-safe function, and therefore should
not be called after a fork in a multithreaded application.

For more details, see:
http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_atfork.html

This is therefore not a bug in the GNU libc, but rather a bug in your
program.

-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
aurel...@aurel32.net                 http://www.aurel32.net



-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to