threads/123062: C++ exception handling can loop during stacking
unwinding in multithreaded programs
Andy Newman
an at atrn.org
Sun Apr 27 04:40:04 UTC 2008
The following reply was made to PR threads/123062; it has been noted by GNATS.
From: Andy Newman <an at atrn.org>
To: bug-followup at FreeBSD.org, Andy Newman <an at atrn.org>
Cc:
Subject: Re: threads/123062: C++ exception handling can loop during stacking unwinding in multithreaded programs
Date: Sun, 27 Apr 2008 10:53:13 +1000
Yes, obviously it needs the bind lock before it accesses the objs
list. As in,
Index: rtld.c
===================================================================
RCS file: /home/ncvs/root/src/src/libexec/rtld-elf/rtld.c,v
retrieving revision 1.124
diff -u -r1.124 rtld.c
--- rtld.c 17 May 2007 18:00:27 -0000 1.124
+++ rtld.c 27 Apr 2008 00:51:25 -0000
@@ -2098,9 +2098,10 @@
{
struct dl_phdr_info phdr_info;
const Obj_Entry *obj;
- int error, lockstate;
+ int error, bind_lockstate, phdr_lockstate;
- lockstate = rlock_acquire(rtld_bind_lock);
+ phdr_lockstate = wlock_acquire(rtld_phdr_lock);
+ bind_lockstate = rlock_acquire(rtld_bind_lock);
error = 0;
@@ -2119,7 +2120,8 @@
break;
}
- rlock_release(rtld_bind_lock, lockstate);
+ rlock_release(rtld_bind_lock, bind_lockstate);
+ wlock_release(rtld_phdr_lock, phdr_lockstate);
return (error);
}
Index: rtld_lock.c
===================================================================
RCS file: /home/ncvs/root/src/src/libexec/rtld-elf/rtld_lock.c,v
retrieving revision 1.4
diff -u -r1.4 rtld_lock.c
--- rtld_lock.c 3 Apr 2007 18:28:13 -0000 1.4
+++ rtld_lock.c 27 Apr 2008 00:50:01 -0000
@@ -171,7 +171,7 @@
lockinfo.thread_clr_flag(mask);
}
-#define RTLD_LOCK_CNT 2
+#define RTLD_LOCK_CNT 3
struct rtld_lock {
void *handle;
int mask;
@@ -179,6 +179,7 @@
rtld_lock_t rtld_bind_lock = &rtld_locks[0];
rtld_lock_t rtld_libc_lock = &rtld_locks[1];
+rtld_lock_t rtld_phdr_lock = &rtld_locks[2];
int
rlock_acquire(rtld_lock_t lock)
Index: rtld_lock.h
===================================================================
RCS file: /home/ncvs/root/src/src/libexec/rtld-elf/rtld_lock.h,v
retrieving revision 1.2
diff -u -r1.2 rtld_lock.h
--- rtld_lock.h 19 Jun 2003 02:39:37 -0000 1.2
+++ rtld_lock.h 27 Apr 2008 00:50:34 -0000
@@ -52,6 +52,7 @@
extern rtld_lock_t rtld_bind_lock;
extern rtld_lock_t rtld_libc_lock;
+extern rtld_lock_t rtld_phdr_lock;
int rlock_acquire(rtld_lock_t);
int wlock_acquire(rtld_lock_t);
More information about the freebsd-threads
mailing list