]> git.sur5r.net Git - openldap/commitdiff
don't risk leaving around client library error codes; try to return additional inform...
authorQuanah Gibson-Mount <quanah@openldap.org>
Mon, 13 Dec 2010 23:32:15 +0000 (23:32 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Mon, 13 Dec 2010 23:32:15 +0000 (23:32 +0000)
servers/slapd/back-ldap/bind.c
servers/slapd/back-ldap/search.c
servers/slapd/back-meta/bind.c
servers/slapd/back-meta/conn.c
servers/slapd/back-meta/search.c

index a2f3751fae6c295b22ef3b25ad26f7058a447d21..1862022ab13a86c0c9142c964a62ef36723742a1 100644 (file)
@@ -584,12 +584,13 @@ retry:;
                                rc = ldap_parse_extended_result( ld, res,
                                                NULL, &data, 0 );
                                if ( rc == LDAP_SUCCESS ) {
-                                       int err;
-                                       rc = ldap_parse_result( ld, res, &err,
+                                       SlapReply rs;
+                                       rc = ldap_parse_result( ld, res, &rs.sr_err,
                                                NULL, NULL, NULL, NULL, 1 );
-                                       if ( rc == LDAP_SUCCESS ) {
-                                               rc = err;
+                                       if ( rc != LDAP_SUCCESS ) {
+                                               rs.sr_err = rc;
                                        }
+                                       rc = slap_map_api2result( &rs );
                                        res = NULL;
                                        
                                        /* FIXME: in case a referral 
@@ -1804,10 +1805,12 @@ retry:;
 
                        rc = ldap_parse_result( lc->lc_ld, res, &rs->sr_err,
                                        &match, &text, &refs, &ctrls, 1 );
-                       rs->sr_text = text;
-                       if ( rc != LDAP_SUCCESS ) {
+                       if ( rc == LDAP_SUCCESS ) {
+                               rs->sr_text = text;
+                       } else {
                                rs->sr_err = rc;
                        }
+                       rs->sr_err = slap_map_api2result( rs );
 
                        /* RFC 4511: referrals can only appear
                         * if result code is LDAP_REFERRAL */
@@ -1901,14 +1904,14 @@ retry:;
                ber_memvfree( (void **)refs );
        }
 
-               /* match should not be possible with a successful bind */
-               if ( match ) {
-                       if ( rs->sr_matched != match ) {
-                               free( (char *)rs->sr_matched );
-                       }
-                       rs->sr_matched = NULL;
-                       ldap_memfree( match );
+       /* match should not be possible with a successful bind */
+       if ( match ) {
+               if ( rs->sr_matched != match ) {
+                       free( (char *)rs->sr_matched );
                }
+               rs->sr_matched = NULL;
+               ldap_memfree( match );
+       }
 
        if ( ctrls != NULL ) {
                if ( op->o_tag == LDAP_REQ_BIND && rs->sr_err == LDAP_SUCCESS ) {
index e2125e82b0ac64d6a6070bb8a8867af7cea4faf5..c8b7731bbaa97aa70a9c3801121a1eae4c2be00b 100644 (file)
@@ -462,14 +462,15 @@ retry:
                        rc = ldap_parse_result( lc->lc_ld, res, &rs->sr_err,
                                        &match.bv_val, &err,
                                        &references, &rs->sr_ctrls, 1 );
-                       if ( rc != LDAP_SUCCESS ) {
+                       if ( rc == LDAP_SUCCESS ) {
+                               if ( err ) {
+                                       rs->sr_text = err;
+                                       freetext = 1;
+                               }
+                       } else {
                                rs->sr_err = rc;
                        }
                        rs->sr_err = slap_map_api2result( rs );
-                       if ( err ) {
-                               rs->sr_text = err;
-                               freetext = 1;
-                       }
 
                        /* RFC 4511: referrals can only appear
                         * if result code is LDAP_REFERRAL */
index 5c56ec427429b9af72f475fdc99d04026e3d9387..7c89bee1898bf2287c22f68dfee07c9d638f6663 100644 (file)
@@ -425,6 +425,7 @@ retry:;
                        if ( rc != LDAP_SUCCESS ) {
                                rs->sr_err = rc;
                        }
+                       rs->sr_err = slap_map_api2result( rs );
                        break;
                }
        }
@@ -1042,10 +1043,12 @@ retry:;
                                rc = ldap_parse_result( msc->msc_ld, res, &rs->sr_err,
                                                &matched, &text, &refs, &ctrls, 1 );
                                res = NULL;
-                               rs->sr_text = text;
-                               if ( rc != LDAP_SUCCESS ) {
+                               if ( rc == LDAP_SUCCESS ) {
+                                       rs->sr_text = text;
+                               } else {
                                        rs->sr_err = rc;
                                }
+                               rs->sr_err = slap_map_api2result( rs );
 
                                /* RFC 4511: referrals can only appear
                                 * if result code is LDAP_REFERRAL */
index 7fa6ce65b95bba29003f7a24c3ba4fc200112ccd..ca5b7932c380ff1f616ccb30411261273ccb40d5 100644 (file)
@@ -485,6 +485,7 @@ retry:;
                                        if ( rs->sr_err == LDAP_SUCCESS ) {
                                                rs->sr_err = err;
                                        }
+                                       rs->sr_err = slap_map_api2result( rs );
                                        
                                        /* FIXME: in case a referral 
                                         * is returned, should we try
index 00000313cdebf76498c3a8fe185468b568bd2205..f54a6ac77c7c8f402a4eb99cc714a6f5346a957a 100644 (file)
@@ -393,10 +393,8 @@ meta_search_dobind_result(
                NULL, NULL, NULL, NULL, 0 );
        if ( rc != LDAP_SUCCESS ) {
                candidates[ candidate ].sr_err = rc;
-
-       } else {
-               rc = slap_map_api2result( &candidates[ candidate ] );
        }
+       rc = slap_map_api2result( &candidates[ candidate ] );
 
        ldap_pvt_thread_mutex_lock( &mi->mi_conninfo.lai_mutex );
        LDAP_BACK_CONN_BINDING_CLEAR( msc );
@@ -701,6 +699,7 @@ meta_back_search( Operation *op, SlapReply *rs )
        int             is_ok = 0;
        void            *savepriv;
        SlapReply       *candidates = NULL;
+       int             do_taint = 0;
 
        /*
         * controls are set in ldap_back_dobind()
@@ -1305,11 +1304,12 @@ really_bad:;
                                                msg,
                                                &candidates[ i ].sr_err,
                                                (char **)&candidates[ i ].sr_matched,
-                                               NULL /* (char **)&candidates[ i ].sr_text */ ,
+                                               (char **)&candidates[ i ].sr_text,
                                                &references,
                                                NULL /* &candidates[ i ].sr_ctrls (unused) */ ,
                                                0 );
                                        if ( rs->sr_err != LDAP_SUCCESS ) {
+                                               candidates[ i ].sr_err = rs->sr_err;
                                                sres = slap_map_api2result( &candidates[ i ] );
                                                candidates[ i ].sr_type = REP_RESULT;
                                                ldap_msgfree( res );
@@ -1451,9 +1451,12 @@ really_bad:;
                                                if ( rs->sr_nentries == op->ors_slimit
                                                        || META_BACK_ONERR_STOP( mi ) )
                                                {
+                                                       const char *save_text = rs->sr_text;
                                                        savepriv = op->o_private;
                                                        op->o_private = (void *)i;
+                                                       rs->sr_text = candidates[ i ].sr_text;
                                                        send_ldap_result( op, rs );
+                                                       rs->sr_text = save_text;
                                                        op->o_private = savepriv;
                                                        ldap_msgfree( res );
                                                        res = NULL;
@@ -1464,9 +1467,12 @@ really_bad:;
                                        default:
                                                candidates[ i ].sr_err = rs->sr_err;
                                                if ( META_BACK_ONERR_STOP( mi ) ) {
+                                                       const char *save_text = rs->sr_text;
                                                        savepriv = op->o_private;
                                                        op->o_private = (void *)i;
+                                                       rs->sr_text = candidates[ i ].sr_text;
                                                        send_ldap_result( op, rs );
+                                                       rs->sr_text = save_text;
                                                        op->o_private = savepriv;
                                                        ldap_msgfree( res );
                                                        res = NULL;
@@ -1814,12 +1820,17 @@ finish:;
                        && op->o_time > mc->mc_conns[ i ].msc_time )
                {
                        /* don't let anyone else use this expired connection */
-                       LDAP_BACK_CONN_TAINTED_SET( mc );
+                       do_taint++;
                }
        }
 
        if ( mc ) {
-               meta_back_release_conn( mi, mc );
+               ldap_pvt_thread_mutex_lock( &mi->mi_conninfo.lai_mutex );
+               if ( do_taint ) {
+                       LDAP_BACK_CONN_TAINTED_SET( mc );
+               }
+               meta_back_release_conn_lock( mi, mc, 0 );
+               ldap_pvt_thread_mutex_unlock( &mi->mi_conninfo.lai_mutex );
        }
 
        return rs->sr_err;