From: Stefan Metzmacher Date: Tue, 3 Apr 2018 11:13:01 +0000 (+0200) Subject: talloc: use atexit() again instead of a library destructor X-Git-Url: http://git.samba.org/?p=metze%2Fsamba%2Fwip.git;a=commitdiff_plain;h=03124c85f1141f1e57398e526f38798b6f1fa741 talloc: use atexit() again instead of a library destructor The change for https://bugzilla.samba.org/show_bug.cgi?id=7587 ("talloc_autofree_context() in shared libraries and plugins is a bad idea on FreeBSD") (ommit 41b6810ba01f44537f470c806adb8686e1a39c48) causes the following for sssd on Linux: Stack trace of thread 19667: #0 0x00007f2cab91ff6b __GI_raise (libc.so.6) #1 0x00007f2cab90a5c1 __GI_abort (libc.so.6) #2 0x00007f2cab90a491 __assert_fail_base (libc.so.6) #3 0x00007f2cab9186e2 __GI___assert_fail (libc.so.6) #4 0x00007f2cb10aaca5 k5_mutex_lock (libkrb5.so.3) #5 0x00007f2cb10ab790 k5_mutex_lock (libkrb5.so.3) #6 0x00007f2cb10ab8f5 profile_free_file (libkrb5.so.3) #7 0x00007f2cb10ab983 profile_close_file (libkrb5.so.3) #8 0x00007f2cb10af249 profile_release (libkrb5.so.3) #9 0x00007f2cb10a06c7 k5_os_free_context (libkrb5.so.3) #10 0x00007f2cb1075a9a krb5_free_context (libkrb5.so.3) #11 0x000055cea7cb2dd1 kcm_data_destructor (sssd_kcm) #12 0x00007f2cac153e96 _tc_free_internal (libtalloc.so.2) #13 0x00007f2cac1537b0 _tc_free_internal (libtalloc.so.2) #14 0x00007f2cac1537b0 _tc_free_internal (libtalloc.so.2) #15 0x00007f2cac1537b0 _tc_free_internal (libtalloc.so.2) #16 0x00007f2cac1537b0 _tc_free_internal (libtalloc.so.2) #17 0x00007f2cac14e648 _talloc_free (libtalloc.so.2) #18 0x00007f2cac14c480 talloc_lib_fini (libtalloc.so.2) #19 0x00007f2cb151da96 _dl_fini (ld-linux-x86-64.so.2) #20 0x00007f2cab9226bc __run_exit_handlers (libc.so.6) #21 0x00007f2cab9227ec __GI_exit (libc.so.6) #22 0x00007f2cb030dc61 orderly_shutdown (libsss_util.so) #23 0x00007f2cac365a46 tevent_common_check_signal (libtevent.so.0) #24 0x00007f2cac367975 epoll_event_loop_once (libtevent.so.0) #25 0x00007f2cac365dab std_event_loop_once (libtevent.so.0) #26 0x00007f2cac362098 _tevent_loop_once (libtevent.so.0) #27 0x00007f2cac3622eb tevent_common_loop_wait (libtevent.so.0) #28 0x00007f2cac365d3b std_event_loop_wait (libtevent.so.0) #29 0x00007f2cb030eb37 server_loop (libsss_util.so) #30 0x000055cea7cb29f4 main (sssd_kcm) #31 0x00007f2cab90c1eb __libc_start_main (libc.so.6) #32 0x000055cea7cb2c7a _start (sssd_kcm) We still only register one atexit handler instead of multiple ones like in talloc 2.1.11, but avoids using a library destructor. Bug #7587 seems to be fixed by not using talloc_autofree_context() within samba. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13366 Signed-off-by: Stefan Metzmacher Reviewed-by: Andreas Schneider --- diff --git a/lib/talloc/talloc.c b/lib/talloc/talloc.c index ce3bda45ece5..54be63495aec 100644 --- a/lib/talloc/talloc.c +++ b/lib/talloc/talloc.c @@ -430,12 +430,7 @@ void talloc_lib_init(void) #warning "No __attribute__((constructor)) support found on this platform, additional talloc security measures not available" #endif -#ifdef HAVE_DESTRUCTOR_ATTRIBUTE -void talloc_lib_fini(void) __attribute__((destructor)); -void talloc_lib_fini(void) -#else /* ! HAVE_DESTRUCTOR_ATTRIBUTE */ -static void talloc_lib_fini(void) -#endif /* ! HAVE_DESTRUCTOR_ATTRIBUTE */ +static void talloc_lib_atexit(void) { TALLOC_FREE(autofree_context); @@ -452,17 +447,14 @@ static void talloc_lib_fini(void) static void talloc_setup_atexit(void) { -#ifndef HAVE_DESTRUCTOR_ATTRIBUTE static bool done; if (done) { return; } -#warning "No __attribute__((destructor)) support found on this platform, using atexit" - atexit(talloc_lib_fini); + atexit(talloc_lib_atexit); done = true; -#endif /* ! HAVE_DESTRUCTOR_ATTRIBUTE */ } static void talloc_log(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2);