]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/bind.c
Partially revert prev commit, leave rs->sr_err == SLAPD_ABANDON
[openldap] / servers / slapd / back-ldap / bind.c
index 6ba8c4716ba748c0c770bef214907c732a6fb288..9691f11f6df9a1c60e2c1f802f4e47c693e4ff03 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2008 The OpenLDAP Foundation.
+ * Copyright 1999-2009 The OpenLDAP Foundation.
  * Portions Copyright 2000-2003 Pierangelo Masarati.
  * Portions Copyright 1999-2003 Howard Chu.
  * All rights reserved.
@@ -1228,6 +1228,8 @@ ldap_back_dobind_cb(
 {
        ber_tag_t *tptr = op->o_callback->sc_private;
        op->o_tag = *tptr;
+       rs->sr_tag = slap_req2res( op->o_tag );
+
        return SLAP_CB_CONTINUE;
 }
 
@@ -1390,15 +1392,26 @@ retry_lock:;
 
                lutil_sasl_freedefs( defaults );
 
-               rs->sr_err = slap_map_api2result( rs );
-               if ( rs->sr_err != LDAP_SUCCESS ) {
+               switch ( rs->sr_err ) {
+               case LDAP_SUCCESS:
+                       LDAP_BACK_CONN_ISBOUND_SET( lc );
+                       break;
+
+               case LDAP_LOCAL_ERROR:
+                       /* list client API error codes that require
+                        * to taint the connection */
+                       /* FIXME: should actually retry? */
+                       LDAP_BACK_CONN_TAINTED_SET( lc );
+
+                       /* fallthru */
+
+               default:
                        LDAP_BACK_CONN_ISBOUND_CLEAR( lc );
+                       rs->sr_err = slap_map_api2result( rs );
                        if ( sendok & LDAP_BACK_SENDERR ) {
                                send_ldap_result( op, rs );
                        }
-
-               } else {
-                       LDAP_BACK_CONN_ISBOUND_SET( lc );
+                       break;
                }
 
                if ( LDAP_BACK_QUARANTINE( li ) ) {
@@ -1467,7 +1480,7 @@ retry:;
                }
 
                rc = 0;
-               goto leave;
+               goto func_leave;
        }
 
        rc = ldap_back_op_result( lc, op, rs, msgid,
@@ -1486,7 +1499,7 @@ done:;
                ldap_set_rebind_proc( lc->lc_ld, li->li_rebind_f, lc );
        }
 
-leave:;
+func_leave:;
        if ( op->o_callback == &cb )
                op->o_callback = cb.sc_next;
        op->o_tag = o_tag;
@@ -1624,8 +1637,6 @@ ldap_back_op_result(
        char            **refs = NULL;
        LDAPControl     **ctrls = NULL;
 
-#define        ERR_OK(err) ((err) == LDAP_SUCCESS || (err) == LDAP_COMPARE_FALSE || (err) == LDAP_COMPARE_TRUE)
-
        rs->sr_text = NULL;
        rs->sr_matched = NULL;
        rs->sr_ref = NULL;
@@ -1634,7 +1645,7 @@ ldap_back_op_result(
        /* if the error recorded in the reply corresponds
         * to a successful state, get the error from the
         * remote server response */
-       if ( ERR_OK( rs->sr_err ) ) {
+       if ( LDAP_ERR_OK( rs->sr_err ) ) {
                int             rc;
                struct timeval  tv;
                LDAPMessage     *res = NULL;
@@ -1787,7 +1798,7 @@ retry:;
        /* if the error in the reply structure is not
         * LDAP_SUCCESS, try to map it from client 
         * to server error */
-       if ( !ERR_OK( rs->sr_err ) ) {
+       if ( !LDAP_ERR_OK( rs->sr_err ) ) {
                rs->sr_err = slap_map_api2result( rs );
 
                /* internal ops ( op->o_conn == NULL ) 
@@ -1812,8 +1823,8 @@ retry:;
                }
 
        } else if ( op->o_conn &&
-               ( ( ( sendok & LDAP_BACK_SENDOK ) && ERR_OK( rs->sr_err ) )
-                       || ( ( sendok & LDAP_BACK_SENDERR ) && rs->sr_err != LDAP_SUCCESS ) ) )
+               ( ( ( sendok & LDAP_BACK_SENDOK ) && LDAP_ERR_OK( rs->sr_err ) )
+                       || ( ( sendok & LDAP_BACK_SENDERR ) && !LDAP_ERR_OK( rs->sr_err ) ) ) )
        {
                send_ldap_result( op, rs );
        }
@@ -1846,7 +1857,7 @@ retry:;
                rs->sr_ctrls = NULL;
        }
 
-       return( ERR_OK( rs->sr_err ) ? LDAP_SUCCESS : rs->sr_err );
+       return( LDAP_ERR_OK( rs->sr_err ) ? LDAP_SUCCESS : rs->sr_err );
 }
 
 /* return true if bound, false if failed */
@@ -2134,15 +2145,26 @@ ldap_back_proxy_authz_bind(
                                LDAP_SASL_QUIET, lutil_sasl_interact,
                                defaults );
 
-               rs->sr_err = slap_map_api2result( rs );
-               if ( rs->sr_err != LDAP_SUCCESS ) {
+               switch ( rs->sr_err ) {
+               case LDAP_SUCCESS:
+                       LDAP_BACK_CONN_ISBOUND_SET( lc );
+                       break;
+
+               case LDAP_LOCAL_ERROR:
+                       /* list client API error codes that require
+                        * to taint the connection */
+                       /* FIXME: should actually retry? */
+                       LDAP_BACK_CONN_TAINTED_SET( lc );
+
+                       /* fallthru */
+
+               default:
                        LDAP_BACK_CONN_ISBOUND_CLEAR( lc );
+                       rs->sr_err = slap_map_api2result( rs );
                        if ( sendok & LDAP_BACK_SENDERR ) {
                                send_ldap_result( op, rs );
                        }
-
-               } else {
-                       LDAP_BACK_CONN_ISBOUND_SET( lc );
+                       break;
                }
 
                lutil_sasl_freedefs( defaults );
@@ -2184,7 +2206,9 @@ ldap_back_proxy_authz_bind(
                 * so that referral chasing is attempted using the right
                 * identity */
                LDAP_BACK_CONN_ISBOUND_SET( lc );
-               ber_bvreplace( &lc->lc_bound_ndn, binddn );
+               if ( !BER_BVISNULL( binddn ) ) {
+                       ber_bvreplace( &lc->lc_bound_ndn, binddn );
+               }
 
                if ( !BER_BVISNULL( &lc->lc_cred ) ) {
                        memset( lc->lc_cred.bv_val, 0,
@@ -2192,8 +2216,10 @@ ldap_back_proxy_authz_bind(
                }
 
                if ( LDAP_BACK_SAVECRED( li ) ) {
-                       ber_bvreplace( &lc->lc_cred, bindcred );
-                       ldap_set_rebind_proc( lc->lc_ld, li->li_rebind_f, lc );
+                       if ( !BER_BVISNULL( bindcred ) ) {
+                               ber_bvreplace( &lc->lc_cred, bindcred );
+                               ldap_set_rebind_proc( lc->lc_ld, li->li_rebind_f, lc );
+                       }
 
                } else {
                        lc->lc_cred.bv_len = 0;
@@ -2589,7 +2615,7 @@ ldap_back_controls_add(
                goto done;
        }
 
-       assert( j1 + j1 <= sizeof( c )/sizeof(LDAPControl) );
+       assert( j1 + j2 <= (int) (sizeof( c )/sizeof( c[0] )) );
 
        if ( op->o_ctrls ) {
                for ( n = 0; op->o_ctrls[ n ]; n++ )