changeset 12913:90a66b2c063f

6971440 moe can core dump while processing libc.
author Rod Evans <Rod.Evans@Sun.COM>
date Fri, 23 Jul 2010 16:35:08 -0700
parents b8a81d02e92b
children 3bb859a7330c
files usr/src/cmd/sgs/packages/common/SUNWonld-README usr/src/cmd/sgs/rtld/common/dlfcns.c
diffstat 2 files changed, 8 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/sgs/packages/common/SUNWonld-README	Fri Jul 23 16:15:32 2010 -0700
+++ b/usr/src/cmd/sgs/packages/common/SUNWonld-README	Fri Jul 23 16:35:08 2010 -0700
@@ -1616,3 +1616,4 @@
 	PSARC/2010/224 Support for archives larger than 2 GB
 6956152 dlclose() from an auditor can be fatal. Preinit/activity events should
 	be more flexible. (D)
+6971440 moe can core dump while processing libc.
--- a/usr/src/cmd/sgs/rtld/common/dlfcns.c	Fri Jul 23 16:15:32 2010 -0700
+++ b/usr/src/cmd/sgs/rtld/common/dlfcns.c	Fri Jul 23 16:35:08 2010 -0700
@@ -492,14 +492,16 @@
 	/*
 	 * If this handle is associated with an object that is not on the base
 	 * link-map control list, or it has not yet been relocated, then this
-	 * handle must have originated from an auditors interaction.  User code
+	 * handle must have originated from an auditors interaction, or some
+	 * permutation of RTLD_CONFGEN use (crle(1), moe(1), etc.).  User code
 	 * can only execute and bind to relocated objects on the base link-map
-	 * control list.  A non-relocated object, or an object on a non-base
-	 * link-map control list, is in the process of being loaded, and
-	 * therefore we do not attempt to remove the handle, as we might
-	 * mistakenly delete the object thinking that its loading has failed.
+	 * control list.  Outside of RTLD_CONFGEN use, a non-relocated object,
+	 * or an object on a non-base link-map control list, is in the process
+	 * of being loaded, and therefore we do not attempt to remove the
+	 * handle.
 	 */
 	if (((lmp = ghp->gh_ownlmp) != NULL) &&
+	    ((MODE(lmp) & RTLD_CONFGEN) == 0) &&
 	    ((CNTL(lmp) != ALIST_OFF_DATA) ||
 	    ((FLAGS(lmp) & FLG_RT_RELOCED) == 0)))
 		return (0);