svn commit: r212837 - head/lib/libthr/thread

David Xu davidxu at FreeBSD.org
Sun Sep 19 05:19:48 UTC 2010


Author: davidxu
Date: Sun Sep 19 05:19:47 2010
New Revision: 212837
URL: http://svn.freebsd.org/changeset/base/212837

Log:
  Fix a race condition when finding stack unwinding functions.

Modified:
  head/lib/libthr/thread/thr_exit.c

Modified: head/lib/libthr/thread/thr_exit.c
==============================================================================
--- head/lib/libthr/thread/thr_exit.c	Sun Sep 19 02:07:30 2010	(r212836)
+++ head/lib/libthr/thread/thr_exit.c	Sun Sep 19 05:19:47 2010	(r212837)
@@ -70,18 +70,31 @@ static void
 thread_uw_init(void)
 {
 	static int inited = 0;
+	Dl_info dlinfo;
 	void *handle;
+	void *forcedunwind, *resume, *getcfa;
 
 	if (inited)
-		return;
-	inited = 1;
+	    return;
 	handle = RTLD_DEFAULT;
-	if ((uwl_forcedunwind = dlsym(handle, "_Unwind_ForcedUnwind")) == NULL||
-	    (uwl_resume = dlsym(handle, "_Unwind_Resume")) == NULL ||
-	    (uwl_getcfa = dlsym(handle, "_Unwind_GetCFA")) == NULL) {
-		uwl_forcedunwind = NULL;
-		return;
+	if ((forcedunwind = dlsym(handle, "_Unwind_ForcedUnwind")) != NULL) {
+	    if (dladdr(forcedunwind, &dlinfo)) {
+		if ((handle = dlopen(dlinfo.dli_fname, RTLD_LAZY)) != NULL) {
+		    forcedunwind = dlsym(handle, "_Unwind_ForcedUnwind");
+		    resume = dlsym(handle, "_Unwind_Resume");
+		    getcfa = dlsym(handle, "_Unwind_GetCFA");
+		    if (forcedunwind != NULL && resume != NULL &&
+			getcfa != NULL) {
+			uwl_forcedunwind = forcedunwind;
+			uwl_resume = resume;
+			uwl_getcfa = getcfa;
+		    } else {
+			dlclose(handle);
+		    }
+		}
+	    }
 	}
+	inited = 1;
 }
 
 void


More information about the svn-src-head mailing list