Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 27 Apr 2008 04:40:04 GMT
From:      Andy Newman <an@atrn.org>
To:        freebsd-threads@FreeBSD.org
Subject:   Re: threads/123062: C++ exception handling can loop during stacking unwinding in multithreaded programs
Message-ID:  <200804270440.m3R4e4Cr063504@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR threads/123062; it has been noted by GNATS.

From: Andy Newman <an@atrn.org>
To: bug-followup@FreeBSD.org, Andy Newman <an@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);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200804270440.m3R4e4Cr063504>