On Wed, Apr 29, 2020 at 2:43 PM Ruediger Pluem <rpl...@apache.org> wrote: > > > > On 4/29/20 5:02 PM, Eric Covener wrote: > > On Wed, Apr 29, 2020 at 9:29 AM Joe Orton <jor...@redhat.com> wrote: > >> > >> In uldap_connection_unbind, apr_ldap_rebind_remove() is always passed > >> NULL since ldc->ldap is either NULL on entry or is set to NULL. This > >> looks safe, but seems like an expensive noop since > >> apr_ldap_rebind_remove() acquires a mutex and iterates a linked list > >> trying to find a rebind reference matching NULL (I assume always > >> failing). > >> > >> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ldap/util_ldap.c?revision=1876599&view=markup#l222 > >> > >> Can this be removed or should it be moved up so it's not a noop? I've > >> not tried to reproduce problems in an LDAP config with referrals. > >> > >> (Credit to Abhishek and Angel who saw apr_ldap_rebind_remove() spinning > >> and debugged this) > >> > >> Index: modules/ldap/util_ldap.c > >> =================================================================== > >> --- modules/ldap/util_ldap.c (revision 1877157) > >> +++ modules/ldap/util_ldap.c (working copy) > >> @@ -225,6 +225,12 @@ > >> > >> if (ldc) { > >> if (ldc->ldap) { > >> + /* forget the rebind info for this conn */ > >> + if (ldc->ChaseReferrals == AP_LDAP_CHASEREFERRALS_ON) { > >> + apr_ldap_rebind_remove(ldc->ldap); > >> + apr_pool_clear(ldc->rebind_pool); > >> + } > >> + > >> if (ldc->r) { > >> ap_log_rerror(APLOG_MARK, APLOG_TRACE5, 0, ldc->r, "LDC > >> %pp unbind", ldc); > >> } > >> @@ -233,11 +239,6 @@ > >> } > >> ldc->bound = 0; > >> > >> - /* forget the rebind info for this conn */ > >> - if (ldc->ChaseReferrals == AP_LDAP_CHASEREFERRALS_ON) { > >> - apr_ldap_rebind_remove(ldc->ldap); > >> - apr_pool_clear(ldc->rebind_pool); > >> - } > >> } > > > > +1 to moving up > > Hm. Don't we need to do the apr_pool_clear(ldc->rebind_pool); in any case if > ldc->ChaseReferrals == AP_LDAP_CHASEREFERRALS_ON or > does this only makes sense if ldc->ldap != NULL? > And can we still do an ldap_unbind_s(ldc->ldap); if we did an > apr_ldap_rebind_remove(ldc->ldap); before?
I see what you mean. If we lost the ldc->ldap some other way, anything allocated from ldc->rebind_pool is leaked because the LDAP key can't be looked up in the xref linked list. We would likely have linked list growth in that case too.