This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: linuxthread race condition


Wolfram Gloger <wmglo@dent.med.uni-muenchen.de> writes:

|> > There is a race condition in linuxthreads during thread creation on
|> > architectures that use a dedicated thread register.  Between the point the
|> > thread is created and inserted in the list of active threads, and the
|> > point the thread register is initialized in the child a cancel signal may
|> > arrive, with the thread manager calling pthread_handle_exit.
|> ...
|> > To fix this race I have blocked the cancel signal in the manager around
|> > the clone call, so that the child does not call the signal handler before
|> > thread_self is initialized.
|> 
|> Wouldn't it be enough to check for this special case in
|> pthread_handle_sigcancel(), like so:
|> 
|> static void pthread_handle_sigcancel(int sig)
|> {
|>   pthread_descr self = thread_self();
|>   sigjmp_buf * jmpbuf;
|> 
|>   if (self == &__pthread_manager_thread)
|>     {
|>       if (thread_self_stack() == &__pthread_manager_thread)
|>         {
|> 	  __pthread_manager_sighandler(sig);
|>           return;
|>         }
|>       /* Oops, thread_self() isn't working yet..  */
|>       self = thread_self_stack();
|>     }
|> ...
|> 
|> with thread_self_stack() being the current 'normal' thread_self().

Would this thread_self_stack work with FLOATING_STACKS?  What if the stack
size of the new thread is wildly different from STACK_SIZE?  I don't think
that thread_self_stack can always return a valid thread descriptor.

Andreas.

-- 
Andreas Schwab                                  "And now for something
Andreas.Schwab@suse.de				completely different."
SuSE Labs, SuSE GmbH, Schanzäckerstr. 10, D-90443 Nürnberg
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]