nss_ldap broken
Daniel Eischen
eischen at vigrid.com
Fri Mar 26 14:51:03 PST 2004
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
More information about the freebsd-current
mailing list