svn commit: r259288 - stable/10/lib/libc/stdlib

Konstantin Belousov kib at FreeBSD.org
Fri Dec 13 05:54:30 UTC 2013


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

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/10/lib/libc/stdlib/atexit.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libc/stdlib/atexit.c
==============================================================================
--- stable/10/lib/libc/stdlib/atexit.c	Fri Dec 13 05:54:25 2013	(r259287)
+++ stable/10/lib/libc/stdlib/atexit.c	Fri Dec 13 05:54:30 2013	(r259288)
@@ -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);
 }


More information about the svn-src-all mailing list