Author: kib
Date: Fri Dec 13 05:54:58 2013
New Revision: 259289
URL: http://svnweb.freebsd.org/changeset/base/259289

Log:
  MFC r259042:
  Do not force to run atexit handlers, which text comes from a dso owning
  the handle passed to __cxa_finalize() but which are registered by other
  dso, when the process is inside exit(3).

Modified:
  stable/9/lib/libc/stdlib/atexit.c
Directory Properties:
  stable/9/lib/libc/   (props changed)

Modified: stable/9/lib/libc/stdlib/atexit.c
==============================================================================
--- stable/9/lib/libc/stdlib/atexit.c   Fri Dec 13 05:54:30 2013        
(r259288)
+++ stable/9/lib/libc/stdlib/atexit.c   Fri Dec 13 05:54:58 2013        
(r259289)
@@ -151,6 +151,8 @@ __cxa_atexit(void (*func)(void *), void 
 #pragma weak __pthread_cxa_finalize
 void __pthread_cxa_finalize(const struct dl_phdr_info *);
 
+static int global_exit;
+
 /*
  * Call all handlers registered with __cxa_atexit for the shared
  * object owning 'dso'.  Note: if 'dso' is NULL, then all remaining
@@ -164,10 +166,12 @@ __cxa_finalize(void *dso)
        struct atexit_fn fn;
        int n, has_phdr;
 
-       if (dso != NULL)
+       if (dso != NULL) {
                has_phdr = _rtld_addr_phdr(dso, &phdr_info);
-       else
+       } else {
                has_phdr = 0;
+               global_exit = 1;
+       }
 
        _MUTEX_LOCK(&atexit_mutex);
        for (p = __atexit; p; p = p->next) {
@@ -177,8 +181,9 @@ __cxa_finalize(void *dso)
                        fn = p->fns[n];
                        if (dso != NULL && dso != fn.fn_dso) {
                                /* wrong DSO ? */
-                               if (!has_phdr || !__elf_phdr_match_addr(
-                                   &phdr_info, fn.fn_ptr.cxa_func))
+                               if (!has_phdr || global_exit ||
+                                   !__elf_phdr_match_addr(&phdr_info,
+                                   fn.fn_ptr.cxa_func))
                                        continue;
                        }
                        /*
@@ -200,6 +205,6 @@ __cxa_finalize(void *dso)
        if (dso == NULL)
                _MUTEX_DESTROY(&atexit_mutex);
 
-       if (has_phdr && &__pthread_cxa_finalize != NULL)
+       if (has_phdr && !global_exit && &__pthread_cxa_finalize != NULL)
                __pthread_cxa_finalize(&phdr_info);
 }
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "[email protected]"

Reply via email to