# HG changeset patch # User Taylor R Campbell # Date 1784728331 0 # Wed Jul 22 13:52:11 2026 +0000 # Branch trunk # Node ID a115a0414cf33e3ae4f16b81cbdb9b0f7decf909 # Parent 87206b32d3b1dbd51d2d51983bb40421c1476e4d # EXP-Topic riastradh-pr60469-tlsalignagain ld.elf_so: Fix assertions for TLS variant I without _lwp_settcb. In this case, obj->tlsoffset includes the sizeof(struct tls_tcb) adjustment, so it's not right to assert that offset is aligned to obj->tlsalign; instead, offset + sizeof(struct tls_tcb) is aligned to obj->tlsalign, so offset must be congruent to -sizeof(struct tls_tcb) modulo obj->tlsalign. PR bin/60469: bin/60469: assertion "ALIGNED_P(q, obj->tlsalign)" failed: file "/usr/src/libexec/ld.elf_so/tls.c", line 333 diff -r 87206b32d3b1 -r a115a0414cf3 libexec/ld.elf_so/tls.c --- a/libexec/ld.elf_so/tls.c Tue Jul 21 04:04:26 2026 +0000 +++ b/libexec/ld.elf_so/tls.c Wed Jul 22 13:52:11 2026 +0000 @@ -318,7 +318,12 @@ static struct tls_tcb * assert(ALIGNED_P(p, alignof(struct tls_tcb))); tcb = (struct tls_tcb *)p; p += sizeof(struct tls_tcb); +#ifdef __HAVE___LWP_SETTCB assert(ALIGNED_P(p, _rtld_tls_static_max_align)); +#else + assert((uintptr_t)p % _rtld_tls_static_max_align == + sizeof(struct tls_tcb) % _rtld_tls_static_max_align); +#endif lo = p; #else lo = p; @@ -538,15 +543,21 @@ int #ifdef __HAVE_TLS_VARIANT_I offset = roundup2(_rtld_tls_static_offset, obj->tlsalign); next_offset = offset + obj->tlssize; -#ifndef __HAVE___LWP_GETTCB_FAST +#ifdef __HAVE___LWP_GETTCB_FAST + assert(ALIGNED_P(offset, obj->tlsalign)); +#else offset -= sizeof(struct tls_tcb); + assert(obj->tlsalign == 0 || + offset % obj->tlsalign == + (-(ptrdiff_t)sizeof(struct tls_tcb)) % obj->tlsalign); + assert(ALIGNED_P(offset + sizeof(struct tls_tcb), obj->tlsalign)); #endif #else offset = roundup2(_rtld_tls_static_offset + obj->tlssize, obj->tlsalign); next_offset = offset; + assert(ALIGNED_P(offset, obj->tlsalign)); #endif - assert(ALIGNED_P(offset, obj->tlsalign)); /* * Check if the static allocation was already done. # HG changeset patch # User Taylor R Campbell # Date 1784729183 0 # Wed Jul 22 14:06:23 2026 +0000 # Branch trunk # Node ID bf18f4a8eaa716d6ae15e071a06e7769e636ac3c # Parent a115a0414cf33e3ae4f16b81cbdb9b0f7decf909 # EXP-Topic riastradh-pr60469-tlsalignagain ld.elf_so: Sprinkle assertions in _rtld_tls_module_allocate. PR bin/60469: bin/60469: assertion "ALIGNED_P(q, obj->tlsalign)" failed: file "/usr/src/libexec/ld.elf_so/tls.c", line 333 diff -r a115a0414cf3 -r bf18f4a8eaa7 libexec/ld.elf_so/tls.c --- a/libexec/ld.elf_so/tls.c Wed Jul 22 13:52:11 2026 +0000 +++ b/libexec/ld.elf_so/tls.c Wed Jul 22 14:06:23 2026 +0000 @@ -475,11 +475,25 @@ static void * _rtld_die(); } if (obj->tls_static) { + uint8_t *lo __debugused, *hi __debugused; + + assert(obj->tlsoffset <= _rtld_tls_static_space); + assert(obj->tlssize <= _rtld_tls_static_space); #ifdef __HAVE_TLS_VARIANT_I + assert(obj->tlsoffset <= _rtld_tls_static_space - + obj->tlssize); p = (uint8_t *)tcb + obj->tlsoffset + sizeof(struct tls_tcb); + lo = (uint8_t *)tcb + sizeof(struct tls_tcb); + hi = lo + _rtld_tls_static_space; #else + assert(obj->tlssize <= obj->tlsoffset); p = (uint8_t *)tcb - obj->tlsoffset; + hi = (uint8_t *)tcb; + lo = hi - _rtld_tls_static_space; #endif + assert(ALIGNED_P(p, obj->tlsalign)); + assert(lo <= p); + assert(p + obj->tlssize <= hi); return p; }