From: Howard Chu Date: Fri, 12 May 2006 06:33:27 +0000 (+0000) Subject: ITS#4541 better fix X-Git-Tag: OPENLDAP_REL_ENG_2_4_1ALPHA~2^2~36 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=ff40a705da1ce46b1162d4d3eb3dbdd3dbe5db54;p=openldap ITS#4541 better fix --- diff --git a/libraries/libldap/cyrus.c b/libraries/libldap/cyrus.c index 6c82969f09..936f44d35b 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 a7f05c2c56..ef21432fdd 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 d02048dfd6..785260a5d8 100644 --- a/libraries/libldap/open.c +++ b/libraries/libldap/open.c @@ -35,28 +35,19 @@ #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 ) { - int rc = 0; + ld->ld_defconn = ldap_new_connection( ld, + &ld->ld_options.ldo_defludp, 1, 1, NULL ); -#ifdef LDAP_R_COMPILE - ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex ); -#endif /* LDAP_R_COMPILE */ - if ( ld->ld_defconn == NULL ) { - ld->ld_defconn = ldap_new_connection( ld, - &ld->ld_options.ldo_defludp, 1, 1, NULL ); - - if( ld->ld_defconn == NULL ) { - ld->ld_errno = LDAP_SERVER_DOWN; - rc = -1; - } else { - ++ld->ld_defconn->lconn_refcnt; /* so it never gets closed/freed */ - } + if( ld->ld_defconn == NULL ) { + ld->ld_errno = LDAP_SERVER_DOWN; + return -1; } -#ifdef LDAP_R_COMPILE - ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex ); -#endif /* LDAP_R_COMPILE */ - return rc; + + ++ld->ld_defconn->lconn_refcnt; /* so it never gets closed/freed */ + return 0; } /* diff --git a/libraries/libldap/request.c b/libraries/libldap/request.c index 3df34e633f..2fa9f0f8ab 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 );