[PATCH][BZ #19329] Fix race between tls allocation at thread creation and dlopen
Szabolcs Nagy
szabolcs.nagy@arm.com
Thu Jan 7 16:46:00 GMT 2016
On 06/01/16 18:33, Szabolcs Nagy wrote:
> At least the following objects may have conflicting access:
>
> GL(dl_tls_max_dtv_idx)
> GL(dl_tls_generation)
> listp->slotinfo[i].map
> listp->slotinfo[i].gen
> listp->next
>
...
> I think various other accesses to the objects in the list above should
> be atomic as well, but that rabbit hole is deeper than what a quick
> fix could patch up.
i thought i can get away without making listp->next
access atomic, but now i see that can fail too
> /* Check if the current dtv is big enough. */
> - if (dtv[-1].counter < GL(dl_tls_max_dtv_idx))
> + dtv_slots = atomic_load_relaxed (&GL(dl_tls_max_dtv_idx));
> + if (dtv[-1].counter < dtv_slots)
> {
> /* Resize the dtv. */
> dtv = _dl_resize_dtv (dtv);
> @@ -470,6 +473,7 @@ _dl_allocate_tls_init (void *result)
> TLS. For those which are dynamically loaded we add the values
> indicating deferred allocation. */
> listp = GL(dl_tls_dtv_slotinfo_list);
> + gen_count = atomic_load_acquire (&GL(dl_tls_generation));
> while (1)
> {
> size_t cnt;
> @@ -480,18 +484,22 @@ _dl_allocate_tls_init (void *result)
> void *dest;
>
> /* Check for the total number of used slots. */
> - if (total + cnt > GL(dl_tls_max_dtv_idx))
> + if (total + cnt > dtv_slots)
> break;
....
> total += cnt;
> - if (total >= GL(dl_tls_max_dtv_idx))
> + if (total >= dtv_slots)
> break;
>
> listp = listp->next;
here.
a single listp node can hold 64 slotinfo entries, if more
libraries are loaded with tls then GL(dl_tls_max_dtv_idx) > 64,
but the updated listp->next pointer might not be visible here.
i will update the patch.
More information about the Libc-alpha
mailing list