[PATCH][BZ #19329] Fix race between tls allocation at thread creation and dlopen

Ilya Palachev i.palachev@samsung.com
Tue Jan 12 12:20:00 GMT 2016


On 11.01.2016 19:46, Szabolcs Nagy wrote:
> On 11/01/16 16:42, Szabolcs Nagy wrote:
>> On 11/01/16 15:48, Ilya Palachev wrote:
>>> How can you prove that it is working if the assertion that was 
>>> failing is now just deleted from the code?
>>
>> i can only prove that the assertion is wrong by
>> analysing the code: the condition it verifies
>> cannot be enforced with the current design.
>>
>> removing it is harmless since the slotinfo entries
>> are lazy initialized.
>>

Thanks for explanation.
Do you mean that slotinfo entries are lazy initialized in 
_dl_update_slotinfo ?

>
> actually this is not true if dlclose may be called
> concurrently with pthread_create as i noted in my
> new patch description.
>
> i don't know how to protect against that.

Does _dl_update_slotinfo has support for updating DTV's of other threads 
in case when some thread called dlclose?
As I can see dlclose just sets map pointer to NULL and increments the 
generation counter:

1. In remove_slotinfo function:

           listp->slotinfo[idx - disp].gen = GL(dl_tls_generation) + 1;
           listp->slotinfo[idx - disp].map = NULL;

2. In _dl_close_worker function:
   /* If we removed any object which uses TLS bump the generation 
counter.  */
   if (any_tls)
     {
       if (__glibc_unlikely (++GL(dl_tls_generation) == 0))
         _dl_fatal_printf ("TLS generation counter wrapped!  Please 
report as described in "REPORT_BUGS_TO".\n");

       if (tls_free_end == GL(dl_tls_static_used))
         GL(dl_tls_static_used) = tls_free_start;
     }

You have just fixed such memory accesses with atomic_load_acquire and 
atomic_store_release.
Won't these atomics be enough to fix races with dlclose? Or am I missing 
something?

Or you just would like to fill separate bug report for dlclose race?

--
Best regards,
Ilya Palachev



More information about the Libc-alpha mailing list