[PATCH v2 08/14] elf: Fix DTV gap reuse logic [BZ #27135]
Adhemerval Zanella
adhemerval.zanella@linaro.org
Thu Jun 24 12:57:22 GMT 2021
On 24/06/2021 09:27, Florian Weimer via Libc-alpha wrote:
> * Florian Weimer:
>
>> * Szabolcs Nagy via Libc-alpha:
>>
>>> For some reason only dlopen failure caused dtv gaps to be reused.
>>>
>>> It is possible that the intent was to never reuse modids for a
>>> different module, but after dlopen failure all gaps are reused
>>> not just the ones caused by the unfinished dlopened.
>>>
>>> So the code has to handle reused modids already which seems to
>>> work, however the data races at thread creation and tls access
>>> (see bug 19329 and bug 27111) may be more severe if slots are
>>> reused so this is scheduled after those fixes. I think fixing
>>> the races are not simpler if reuse is disallowed and reuse has
>>> other benefits, so set GL(dl_tls_dtv_gaps) whenever entries are
>>> removed from the middle of the slotinfo list. The value does
>>> not have to be correct: incorrect true value causes the next
>>> modid query to do a slotinfo walk, incorrect false will leave
>>> gaps and new entries are added at the end.
>>>
>>> Fixes bug 27135.
>>> ---
>>> elf/dl-close.c | 6 +++++-
>>> elf/dl-open.c | 10 ----------
>>> elf/dl-tls.c | 5 +----
>>> 3 files changed, 6 insertions(+), 15 deletions(-)
>>
>> Apparently this broke GNOME Shell:
>>
>> <https://bugzilla.redhat.com/show_bug.cgi?id=1974970>
>>
>> I'm trying to figure out why.
>
> The bug is that if there is a gap, _dl_next_tls_modid does not update
> the slotinfo list to mark the modid to be returned as reserved, so
> multiple calls in a single dlopen operation keep returning the same
> modid.
>
> I'm not yet sure what the proper fix is for that.
How hard would be to create a testcase for this?
More information about the Libc-alpha
mailing list