Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 26 Mar 2004 17:51:02 -0500 (EST)
From:      Daniel Eischen <eischen@vigrid.com>
To:        Sean McNeil <sean@mcneil.com>
Cc:        freebsd-current@freebsd.org
Subject:   Re: nss_ldap broken
Message-ID:  <Pine.GSO.4.10.10403261747480.16871-100000@pcnet5.pcnet.com>
In-Reply-To: <1080334840.11426.12.camel@server.mcneil.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 26 Mar 2004, Sean McNeil wrote:

> OK, I think I understand this problem...
> 
> When I have my nsswitch.conf setup as follows, I get seg11s:
> 
> passwd: files ldap
> group: files ldap
> 
> This appears to be an issue with any external nss_*.so.1 module that
> uses pthread.  It looks to me it is about the following:
> 
> /*
>  * Cleanup
>  */
> static void
> nss_atexit(void)
> {
> 	(void)_pthread_rwlock_wrlock(&nss_lock);
> 	VECTOR_FREE(_nsmap, &_nsmapsize, sizeof(*_nsmap),
> 	    (vector_free_elem)ns_dbt_free);
> 	VECTOR_FREE(_nsmod, &_nsmodsize, sizeof(*_nsmod),
> 	    (vector_free_elem)ns_mod_free);
> 	(void)_pthread_rwlock_unlock(&nss_lock);
> }
> 
> In my case, the nss_ldap.so.1 module was loaded which pulls in
> libpthread.  I'm not sure how this works without a libpthred, but it
> would appear that unless libpthread.so is loaded everything is OK.  But
> now, it has been loaded and the rwlock_wrlock() works, but then it has
> been unloaded before rwlock_unlock() gets called.
> 
> Would using
> 
> #include <reentrant.h>
> rwlock_wrlock()
> rwlock_unlock()
> 
> macros fix this?

I think I made a comment about how you should always
prefix _pthread_foo() calls with 'if (__isthreaded)'.

When the thread libraries are initialized, then overrwrite
the function pointers in libc's thread jumptable.  If you
unload the library, libc still retains those pointers.

-- 
Dan Eischen



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.10.10403261747480.16871-100000>