[PATCH] Fix problem with sasl_set_mutex

Kurt Zeilenga Kurt.Zeilenga at Isode.com
Wed Sep 24 10:38:39 EDT 2008


Eric,

I think this patch doesn't offer a general solution to the problem.

The root problem here is that neither Cyrus SASL or OpenLDAP libraries  
are truly reentrant.  Each does offer some amount of thread-safety,  
but are each limited by their design.   Obviously, both libraries  
could be improved by redesigning them to have less, or at least, less  
irritating limitations.

Anyways, all this patch does is changes which caller wins the  
initialization conflict.  Where as before, last initializer won, now  
first initializer wins.  So this patch will lead to same sorts of  
'weird crash' behavior as before when two callers make incompatible  
initializations.

I think you need to rework your program to avoid incompatible  
initialization.  This basically means reworking the code so that only  
one call to sasl_set_mutex is made.  Unfortunately, if you are using  
multiple libraries that each make their own calls to sasl_set_mutex,  
you are kind of screwed. If you only are using one such library (such  
as libldap_r), you need to make sure it's the only caller and that  
it's called early enough for all uses of Cyrus SASL.

Unfortunately, things like NSS and PAM can really cause a lot of  
incompatible initialization that outside the control of the program.

-- Kurt

[resent from subscribed address]

On Sep 20, 2008, at 5:41 AM, Eric Leblond wrote:

> Hi,
>
> When working on NuFW (http://www.nufw.org), I've encounter some  
> weird crash
> when calling sasl_dispose. The problem was in fact a logic problem in
> sasl_set_mutex.
>
> NuFW uses sasl and libldap_r. NuFW has to do a call to sasl_set_mutex
> because it is multithreaded. One of the NuFW module uses libldap_r  
> which
> also does a call to sasl_set_mutex. By doing this, we run into a  
> problem
> because sasl_MUTEX_* function change during run time. Thus we can
> allocate a mutex with NuFW function and destroy it with libldap_r
> function. This lead to a crash in almost all cases.
>
> IMHO, the only clean workaround is to modify sasl_set_mutex(): it  
> should
> not be run twice in the same program. I attach a simple patch to this
> mail which implement this behaviour.
>
> BR,
> -- 
> Eric Leblond
> INL: http://www.inl.fr/
> NuFW: http://www.nufw.org/
> <sasl_set_mutex_fix.diff>



More information about the Cyrus-sasl mailing list