libstdc++: eh_globals: gthreads: reset _S_init before deleting key

Clear __eh_globals_init's _S_init in the dtor before deleting the
gthread key.

This ensures that, in case any code involved in deleting the key
interacts with eh_globals, the key that is being deleted won't be
used, and the non-thread-specific eh_globals fallback will.


for  libstdc++-v3/ChangeLog

	* libsupc++/eh_globals.cc [!_GLIBCXX_HAVE_TLS]
	(__eh_globals_init::~__eh_globals_init): Clear _S_init first.
This commit is contained in:
Alexandre Oliva 2022-06-21 23:11:02 -03:00 committed by Alexandre Oliva
parent f129628e8f
commit a33dda016e
1 changed files with 7 additions and 2 deletions

View File

@ -119,8 +119,13 @@ struct __eh_globals_init
~__eh_globals_init()
{
if (_S_init)
__gthread_key_delete(_M_key);
_S_init = false;
{
/* Set it before the call, so that, should
__gthread_key_delete throw an exception, it won't rely on
the key being deleted. */
_S_init = false;
__gthread_key_delete(_M_key);
}
}
__eh_globals_init(const __eh_globals_init&) = delete;