Navigation Menu

Skip to content

Commit

Permalink
rtld: do not allow both dynamic DTV index and static TLS offset
Browse files Browse the repository at this point in the history
If we are allocating static offset for an object with dynamic index,
return failure.  In the opposite case, if dynamic index is requested for
statically allocated TLS area, directly use the offset instead of
setting the index.

Taken from NetBSD Joerg Sonnenberger change for src/libexec/ld.elf_so/tls.c
rev. 1.18.

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
  • Loading branch information
kostikbel committed Jun 5, 2023
1 parent 283a4f4 commit 91880e0
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 0 deletions.
14 changes: 14 additions & 0 deletions libexec/rtld-elf/rtld.c
Expand Up @@ -5463,6 +5463,17 @@ allocate_module_tls(int index)
rtld_die();
}

if (obj->tls_static) {
#ifdef TLS_VARIANT_I
p = (char *)_tcb_get() + obj->tlsoffset;
#else
p = (char *)_tcb_get() - obj->tlsoffset;
#endif
return (p);
}

obj->tls_dynamic = true;

p = malloc_aligned(obj->tlssize, obj->tlsalign, obj->tlspoffset);
memcpy(p, obj->tlsinit, obj->tlsinitsize);
memset(p + obj->tlsinitsize, 0, obj->tlssize - obj->tlsinitsize);
Expand All @@ -5474,6 +5485,9 @@ allocate_tls_offset(Obj_Entry *obj)
{
size_t off;

if (obj->tls_dynamic)
return (false);

if (obj->tls_static)
return (true);

Expand Down
1 change: 1 addition & 0 deletions libexec/rtld-elf/rtld.h
Expand Up @@ -246,6 +246,7 @@ typedef struct Struct_Obj_Entry {
bool jmpslots_done : 1; /* Already have relocated the jump slots */
bool init_done : 1; /* Already have added object to init list */
bool tls_static : 1; /* Already allocated offset for static TLS */
bool tls_dynamic : 1; /* A non-static DTV entry has been allocated */
bool phdr_alloc : 1; /* Phdr is allocated and needs to be freed. */
bool z_origin : 1; /* Process rpath and soname tokens */
bool z_nodelete : 1; /* Do not unload the object and dependencies */
Expand Down

0 comments on commit 91880e0

Please sign in to comment.