Message ID | 20210728062522.3904733-1-siddhesh@sourceware.org |
---|---|
State | New |
Headers | show |
Series | __cxa_thread_atexit_impl: Return -1 on allocation failure | expand |
* Siddhesh Poyarekar via Libc-alpha: > Return -1 in the unlikely event that allocation fails when trying to > register a TLS destructor. This is bug 18524. As said on the bug, the interface is broken. We really need to rework C++ global destructor support so that these dynamic memory allocations become unnecessary. The GCC-generated caller code does not check the return value (and could do anything with it anyway). You probable need to add __libc_fatal. Thanks, Florian
On 7/28/21 12:44 PM, Florian Weimer wrote: > * Siddhesh Poyarekar via Libc-alpha: > >> Return -1 in the unlikely event that allocation fails when trying to >> register a TLS destructor. > > This is bug 18524. As said on the bug, the interface is broken. We > really need to rework C++ global destructor support so that these > dynamic memory allocations become unnecessary. > > The GCC-generated caller code does not check the return value (and could > do anything with it anyway). You probable need to add __libc_fatal. Hmm, so I started with __libc_fatal and changed it to return -1 when I saw that the libstdc++ compat implementation did the same. Now I see that there's no check for return value from the call. I'll update the patch with __libc_fatal and resend. Thanks, Siddhesh
On Jul 28 2021, Siddhesh Poyarekar via Libc-alpha wrote: > Return -1 in the unlikely event that allocation fails when trying to > register a TLS destructor. Ok. Andreas.
diff --git a/stdlib/cxa_thread_atexit_impl.c b/stdlib/cxa_thread_atexit_impl.c index 577ed30931..e956f4d804 100644 --- a/stdlib/cxa_thread_atexit_impl.c +++ b/stdlib/cxa_thread_atexit_impl.c @@ -72,6 +72,7 @@ is not very different from a case where __call_tls_dtors is called after _dl_close_worker on the DSO and hence is an accepted execution. */ +#include <stdio.h> #include <stdlib.h> #include <ldsodefs.h> @@ -104,6 +105,8 @@ __cxa_thread_atexit_impl (dtor_func func, void *obj, void *dso_symbol) /* Prepend. */ struct dtor_list *new = calloc (1, sizeof (struct dtor_list)); + if (__glibc_unlikely (new == NULL)) + return -1; new->func = func; new->obj = obj; new->next = tls_dtor_list;