[PATCH] Fix bug of __register_atfork

Lai Jiangshan laijs@cn.fujitsu.com
Tue Oct 30 01:33:00 GMT 2007


Ulrich Drepper wrote:
> Yes, there is a problem, but your patch is far too expensive.  You
> didn't wonder why there is a set of preallocated structs?  I've checked
> in a patch.
>

Sorry I haven't thought deeply about the preallocated structs.


    It seems there is a little problem in the new patch.
There are two statements in the function __register_atfork():
     newp->next = __fork_handlers;
     __fork_handlers = newp;
which have race condition with __linkin_atfork().

    See this sequence:
Thread-1                             Thread-2

newp->next = __fork_handlers;
                                     __linkin_atfork(linkin_newp).
__fork_handlers = newp;

linkin_newp was failed to be inserted into the linked-list after
this sequence.

    The easiest way to fix this race condition is using 
__linkin_atfork(newp) to replace these two statements.

--- glibc/nptl/sysdeps/unix/sysv/linux/register-atfork.c.org	2007-10-27 15:49:31.000000000 +0800
+++ glibc/nptl/sysdeps/unix/sysv/linux/register-atfork.c	2007-10-27 17:39:26.000000000 +0800
@@ -98,8 +98,7 @@
       newp->child_handler = child;
       newp->dso_handle = dso_handle;
 
-      newp->next = __fork_handlers;
-      __fork_handlers = newp;
+      __linkin_atfork(newp);
     }
 
   /* Release the lock.  */



More information about the Libc-alpha mailing list