Commit 86b37497 authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

Fixed libldap default connection concurrency issue (ITS#4541)

parent bc835b91
......@@ -3,6 +3,7 @@ OpenLDAP 2.3 Change Log
OpenLDAP 2.3.22 Engineering
Fixed libldap referral input destroy issue (ITS#4533)
Fixed libldap ldap_sort_entries tail bug (ITS#4536)
Fixed libldap default connection concurrency issue (ITS#4541)
Fixed libldap_r thread debug missing break
Fixed libldap_r tpool cleanup
Fixed liblutil strtoul(3) usage (ITS#4503)
......
......@@ -602,23 +602,31 @@ ldap_int_sasl_bind(
return ld->ld_errno;
}
rc = 0;
#ifdef LDAP_R_COMPILE
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
#endif
ber_sockbuf_ctrl( ld->ld_sb, LBER_SB_OPT_GET_FD, &sd );
if ( sd == AC_SOCKET_INVALID ) {
/* not connected yet */
int rc;
rc = ldap_open_defconn( ld );
if( rc < 0 ) return ld->ld_errno;
ber_sockbuf_ctrl( ld->ld_defconn->lconn_sb,
LBER_SB_OPT_GET_FD, &sd );
if ( rc == 0 ) {
ber_sockbuf_ctrl( ld->ld_defconn->lconn_sb,
LBER_SB_OPT_GET_FD, &sd );
if( sd == AC_SOCKET_INVALID ) {
ld->ld_errno = LDAP_LOCAL_ERROR;
return ld->ld_errno;
if( sd == AC_SOCKET_INVALID ) {
ld->ld_errno = LDAP_LOCAL_ERROR;
rc = ld->ld_errno;
}
}
}
#ifdef LDAP_R_COMPILE
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
#endif
if( rc != 0 ) return ld->ld_errno;
oldctx = ld->ld_defconn->lconn_sasl_authctx;
......
......@@ -255,12 +255,18 @@ ldap_get_kerberosv4_credentials(
return( NULL );
}
err = 0;
#ifdef LDAP_R_COMPILE
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
#endif
if ( ber_sockbuf_ctrl( ld->ld_sb, LBER_SB_OPT_GET_FD, NULL ) == -1 ) {
/* not connected yet */
int rc = ldap_open_defconn( ld );
if( rc < 0 ) return NULL;
err = ldap_open_defconn( ld );
}
#ifdef LDAP_R_COMPILE
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
#endif
if ( err < 0 ) return NULL;
krbinstance = ld->ld_defconn->lconn_krbinstance;
......
......@@ -35,6 +35,7 @@
#include "ldap-int.h"
#include "ldap_log.h"
/* Caller should hold the req_mutex if simultaneous accesses are possible */
int ldap_open_defconn( LDAP *ld )
{
ld->ld_defconn = ldap_new_connection( ld,
......
......@@ -93,19 +93,25 @@ ldap_send_initial_request(
BerElement *ber,
ber_int_t msgid)
{
int rc;
int rc = 1;
Debug( LDAP_DEBUG_TRACE, "ldap_send_initial_request\n", 0, 0, 0 );
#ifdef LDAP_R_COMPILE
ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
#endif
if ( ber_sockbuf_ctrl( ld->ld_sb, LBER_SB_OPT_GET_FD, NULL ) == -1 ) {
/* not connected yet */
int rc = ldap_open_defconn( ld );
if( rc < 0 ) {
ber_free( ber, 1 );
return( -1 );
}
rc = ldap_open_defconn( ld );
}
#ifdef LDAP_R_COMPILE
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
#endif
if( rc < 0 ) {
ber_free( ber, 1 );
return( -1 );
} else if ( rc == 0 ) {
Debug( LDAP_DEBUG_TRACE,
"ldap_open_defconn: successful\n",
0, 0, 0 );
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment