On Dec 14, 2005, at 22:39, Russ Allbery wrote:
Below is the interesting bit. valgrind at least thinks that the mutexes aren't fully initialized, it looks like, before they're passed into the
pthread functions.  Note that I don't get these same errors when I run
valgrind against the kinit in unstable, so I'm curious about what's
different in your situation.

One thing that I did notice was a bunch of SASL calls earlier on. I think the invalid reads there are probably just the standard ld.so noise that doesn't appear to mean anything, but their presence indicates that you're using some nsswitch module (I'm guessing) that uses SASL. Are you using
LDAP to do UID lookups, by any chance?

I don't know why that would affect things, but maybe it is.

Aha!  I think you may have put your finger on it, Russ.

Part of our approach to dealing with threads has been, when possible, to give the application writer the option of not linking in the pthread library, instead using weak references at run time to see if the library has been loaded. We want programs to be able to dynamically load and unload the Kerberos and GSSAPI libraries without ill effects, and the general wisdom seems to be that dynamically loading a pthread library into a single-threaded program can do Bad Things, like cause different versions of malloc or other functions to be seen, when they may not be fully compatible with the versions already in use by the program.

So now we have another library being loaded somewhere along the way which causes the pthread library to be loaded (libnss_ldap -> libldap_r -> libpthread, on my system), and the Kerberos library is calling pthread_mutex_lock on a structure which it hasn't initialized, when the LDAP code is loaded.

The strange bit is, in 1.4.3, the Kerberos code should be checking for the thread support once, and saving away a flag; if it wasn't loaded at mutex initialization time, we shouldn't be calling pthread_mutex_lock. If we call pthread_mutex_lock, we should've decided earlier to call pthread_mutex_init. So I should do some poking around and see if I can figure out why we still seem to be behaving differently in the two cases.

In any case, I do think libnss_ldap may have a bug -- I don't think libpthread should be getting pulled into a single-threaded program dynamically. Though, if it's guaranteed to be safe with glibc, and remain safe in future releases, we could consider a Linux- or glibc- specific change to punt the weak-reference stuff and always pull in the pthread library ourselves...

Ken
________________________________________________
Kerberos mailing list           [email protected]
https://mailman.mit.edu/mailman/listinfo/kerberos

Reply via email to