mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
BZ #16613: Support TLS in audit libraries.
This commit fixes a bug where the dynamic loader would crash when loading audit libraries, via LD_AUDIT, where those libraries used TLS. The dynamic loader was not considering that the audit libraries would use TLS and failed to bump the TLS generation counter leaving TLS usage inconsistent after loading the audit libraries. https://sourceware.org/ml/libc-alpha/2014-02/msg00569.html
This commit is contained in:
28
elf/dl-tls.c
28
elf/dl-tls.c
@ -105,6 +105,33 @@ _dl_next_tls_modid (void)
|
||||
}
|
||||
|
||||
|
||||
size_t
|
||||
internal_function
|
||||
_dl_count_modids (void)
|
||||
{
|
||||
/* It is rare that we have gaps; see elf/dl-open.c (_dl_open) where
|
||||
we fail to load a module and unload it leaving a gap. If we don't
|
||||
have gaps then the number of modids is the current maximum so
|
||||
return that. */
|
||||
if (__glibc_likely (!GL(dl_tls_dtv_gaps)))
|
||||
return GL(dl_tls_max_dtv_idx);
|
||||
|
||||
/* We have gaps and are forced to count the non-NULL entries. */
|
||||
size_t n = 0;
|
||||
struct dtv_slotinfo_list *runp = GL(dl_tls_dtv_slotinfo_list);
|
||||
while (runp != NULL)
|
||||
{
|
||||
for (size_t i = 0; i < runp->len; ++i)
|
||||
if (runp->slotinfo[i].map != NULL)
|
||||
++n;
|
||||
|
||||
runp = runp->next;
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
#ifdef SHARED
|
||||
void
|
||||
internal_function
|
||||
@ -407,6 +434,7 @@ _dl_allocate_tls_init (void *result)
|
||||
|
||||
/* Keep track of the maximum generation number. This might
|
||||
not be the generation counter. */
|
||||
assert (listp->slotinfo[cnt].gen <= GL(dl_tls_generation));
|
||||
maxgen = MAX (maxgen, listp->slotinfo[cnt].gen);
|
||||
|
||||
if (map->l_tls_offset == NO_TLS_OFFSET
|
||||
|
Reference in New Issue
Block a user