From 86b37497eaca7a48e13c6e19883b37a7ebedde1e Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Mon, 15 May 2006 17:26:46 +0000 Subject: [PATCH] Fixed libldap default connection concurrency issue (ITS#4541) --- CHANGES | 1 + libraries/libldap/cyrus.c | 22 +++++++++++++++------- libraries/libldap/kbind.c | 12 +++++++++--- libraries/libldap/open.c | 1 + libraries/libldap/request.c | 20 +++++++++++++------- 5 files changed, 39 insertions(+), 17 deletions(-) diff --git a/CHANGES b/CHANGES index 50ed1cce09..4d366dba44 100644 --- a/CHANGES +++ b/CHANGES @@ -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) diff --git a/libraries/libldap/cyrus.c b/libraries/libldap/cyrus.c index ac963fc85e..38d98c60b8 100644 --- a/libraries/libldap/cyrus.c +++ b/libraries/libldap/cyrus.c @@ -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; diff --git a/libraries/libldap/kbind.c b/libraries/libldap/kbind.c index 5a83fbef92..2708774ac8 100644 --- a/libraries/libldap/kbind.c +++ b/libraries/libldap/kbind.c @@ -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; diff --git a/libraries/libldap/open.c b/libraries/libldap/open.c index ddf37f9a75..a4a5e5c07e 100644 --- a/libraries/libldap/open.c +++ b/libraries/libldap/open.c @@ -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, diff --git a/libraries/libldap/request.c b/libraries/libldap/request.c index 5cbac2c3ad..55f43b8028 100644 --- a/libraries/libldap/request.c +++ b/libraries/libldap/request.c @@ -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 ); -- 2.39.5