]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/request.c
Don't use default binddn when password is empty
[openldap] / libraries / libldap / request.c
index 66c5b675241d3f6ef378f11a688c0c4c2cab03da..711572c6929cdaaaafd3a26d2e9d37cc7165634f 100644 (file)
@@ -1,6 +1,6 @@
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 /*  Portions
@@ -82,7 +82,8 @@ ldap_send_initial_request(
        LDAP *ld,
        ber_tag_t msgtype,
        const char *dn,
-       BerElement *ber )
+       BerElement *ber,
+       ber_int_t msgid)
 {
        LDAPURLDesc     *servers;
        int rc;
@@ -133,8 +134,14 @@ ldap_send_initial_request(
                        return LDAP_PARAM_ERROR;
        }
 #endif
-       rc = ldap_send_server_request( ld, ber, ld->ld_msgid, NULL,
+#ifdef LDAP_R_COMPILE
+       ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
+#endif
+       rc = ldap_send_server_request( ld, ber, msgid, NULL,
                                                                        servers, NULL, NULL );
+#ifdef LDAP_R_COMPILE
+       ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
+#endif
        if (servers)
                ldap_free_urllist(servers);
        return(rc);
@@ -186,7 +193,7 @@ ldap_send_server_request(
        LDAPreqinfo *bind )
 {
        LDAPRequest     *lr;
-       int incparent;
+       int incparent, rc;
 
 #ifdef NEW_LOGGING
        LDAP_LOG ( OPERATION, ENTRY, "ldap_send_server_request\n", 0, 0, 0 );
@@ -232,11 +239,13 @@ ldap_send_server_request(
         * LDAP_BUSY and let the caller retry later. We only allow a single
         * request to be in WRITING state.
         */
+       rc = 0;
        if ( ld->ld_requests &&
                ld->ld_requests->lr_status == LDAP_REQST_WRITING &&
                ldap_int_flush_request( ld, ld->ld_requests ) < 0 ) {
-               return -1;
+               rc = -1;
        }
+       if ( rc ) return rc;
 
        if (( lr = (LDAPRequest *)LDAP_CALLOC( 1, sizeof( LDAPRequest ))) ==
            NULL ) {
@@ -274,11 +283,11 @@ ldap_send_server_request(
        ld->ld_requests = lr;
        lr->lr_prev = NULL;
 
+       ld->ld_errno = LDAP_SUCCESS;
        if ( ldap_int_flush_request( ld, lr ) == -1 ) {
-               return -1;
+               msgid = -1;
        }
 
-       ld->ld_errno = LDAP_SUCCESS;
        return( msgid );
 }
 
@@ -362,10 +371,18 @@ ldap_new_connection( LDAP *ld, LDAPURLDesc *srvlist, int use_ldsb,
                                        0, 0, 0 );
 #else
                                Debug( LDAP_DEBUG_TRACE, "Call application rebind_proc\n", 0, 0, 0);
+#endif
+#ifdef LDAP_R_COMPILE
+               ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
+               ldap_pvt_thread_mutex_unlock( &ld->ld_res_mutex );
 #endif
                                err = (*ld->ld_rebind_proc)( ld,
                                        bind->ri_url, bind->ri_request, bind->ri_msgid,
                                        ld->ld_rebind_params );
+#ifdef LDAP_R_COMPILE
+               ldap_pvt_thread_mutex_lock( &ld->ld_res_mutex );
+               ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
+#endif
 
                                ld->ld_defconn = savedefconn;
                                --lc->lconn_refcnt;
@@ -388,10 +405,18 @@ ldap_new_connection( LDAP *ld, LDAPURLDesc *srvlist, int use_ldsb,
                                0, 0, 0 );
 #else
                        Debug( LDAP_DEBUG_TRACE, "anonymous rebind via ldap_bind_s\n", 0, 0, 0);
+#endif
+#ifdef LDAP_R_COMPILE
+                       ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
+                       ldap_pvt_thread_mutex_unlock( &ld->ld_res_mutex );
 #endif
                        if ( ldap_bind_s( ld, "", "", LDAP_AUTH_SIMPLE ) != LDAP_SUCCESS ) {
                                err = -1;
                        }
+#ifdef LDAP_R_COMPILE
+                       ldap_pvt_thread_mutex_lock( &ld->ld_res_mutex );
+                       ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
+#endif
                        ld->ld_defconn = savedefconn;
                        --lc->lconn_refcnt;
 
@@ -572,6 +597,9 @@ ldap_dump_requests_and_responses( LDAP *ld )
        LDAPRequest     *lr;
        LDAPMessage     *lm, *l;
 
+#ifdef LDAP_R_COMPILE
+       ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
+#endif
        fprintf( stderr, "** Outstanding Requests:\n" );
        if (( lr = ld->ld_requests ) == NULL ) {
                fprintf( stderr, "   Empty\n" );
@@ -587,7 +615,9 @@ ldap_dump_requests_and_responses( LDAP *ld )
            fprintf( stderr, "   outstanding referrals %d, parent count %d\n",
                    lr->lr_outrefcnt, lr->lr_parentcnt );
        }
-
+#ifdef LDAP_R_COMPILE
+       ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
+#endif
        fprintf( stderr, "** Response Queue:\n" );
        if (( lm = ld->ld_responses ) == NULL ) {
                fprintf( stderr, "   Empty\n" );
@@ -687,7 +717,7 @@ ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, int sref, char *
        BerElement      *ber;
        char            **refarray = NULL;
        LDAPConn        *lc;
-       int                      rc, count, i, j;
+       int                      rc, count, i, j, id;
        LDAPreqinfo  rinfo;
 
        ld->ld_errno = LDAP_SUCCESS;    /* optimistic */
@@ -826,7 +856,8 @@ ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, int sref, char *
                        srv->lud_dn = LDAP_STRDUP( "" );
                }
 
-               ber = re_encode_request( ld, origreq->lr_ber, ++ld->ld_msgid,
+               LDAP_NEXT_MSGID( ld, id );
+               ber = re_encode_request( ld, origreq->lr_ber, id,
                        sref, srv, &rinfo.ri_request );
 
                if( ber == NULL ) {
@@ -848,8 +879,15 @@ ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, int sref, char *
                /* Send the new request to the server - may require a bind */
                rinfo.ri_msgid = origreq->lr_origid;
                rinfo.ri_url = refarray[i];
-               if ( (rc = ldap_send_server_request( ld, ber, ld->ld_msgid,
-                       origreq, srv, NULL, &rinfo )) < 0 ) {
+#ifdef LDAP_R_COMPILE
+               ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
+#endif
+               rc = ldap_send_server_request( ld, ber, id,
+                       origreq, srv, NULL, &rinfo );
+#ifdef LDAP_R_COMPILE
+               ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
+#endif
+               if ( rc < 0 ) {
                        /* Failure, try next referral in the list */
 #ifdef NEW_LOGGING
                        LDAP_LOG ( OPERATION, ERR, 
@@ -928,7 +966,7 @@ ldap_chase_referrals( LDAP *ld,
        int sref,
        int *hadrefp )
 {
-       int             rc, count;
+       int             rc, count, id;
        unsigned        len;
        char            *p, *ref, *unfollowed;
        LDAPRequest     *origreq;
@@ -1024,8 +1062,9 @@ ldap_chase_referrals( LDAP *ld,
 
                *hadrefp = 1;
 
+               LDAP_NEXT_MSGID( ld, id );
                ber = re_encode_request( ld, origreq->lr_ber,
-                   ++ld->ld_msgid, sref, srv, &rinfo.ri_request );
+                   id, sref, srv, &rinfo.ri_request );
 
                if( ber == NULL ) {
                        return -1 ;
@@ -1036,8 +1075,14 @@ ldap_chase_referrals( LDAP *ld,
 
                rinfo.ri_msgid = origreq->lr_origid;
 
-               rc = ldap_send_server_request( ld, ber, ld->ld_msgid,
+#ifdef LDAP_R_COMPILE
+       ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
+#endif
+               rc = ldap_send_server_request( ld, ber, id,
                    lr, srv, NULL, &rinfo );
+#ifdef LDAP_R_COMPILE
+       ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
+#endif
 
                LDAP_FREE( rinfo.ri_url );
 
@@ -1241,6 +1286,9 @@ ldap_find_request_by_msgid( LDAP *ld, ber_int_t msgid )
 {
        LDAPRequest     *lr;
 
+#ifdef LDAP_R_COMPILE
+       ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
+#endif
        for ( lr = ld->ld_requests; lr != NULL; lr = lr->lr_next ) {
                if( lr->lr_status == LDAP_REQST_COMPLETED ) {
                        continue;       /* Skip completed requests */
@@ -1249,6 +1297,9 @@ ldap_find_request_by_msgid( LDAP *ld, ber_int_t msgid )
                        break;
                }
        }
+#ifdef LDAP_R_COMPILE
+       ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
+#endif
 
        return( lr );
 }