]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/result.c
ITS#3846 don't give hashed passwords to SASL, it only wants cleartext.
[openldap] / servers / slapd / result.c
index 37a91b6837e6687bc7d21e2976f05c073e610521..97c5cf385723a7b4225ce032140c2531bea0ec10 100644 (file)
@@ -327,6 +327,11 @@ send_ldap_response(
        int             rc = LDAP_SUCCESS;
        long    bytes;
 
+       if ( rs->sr_err == SLAPD_ABANDON ) {
+               rc = SLAPD_ABANDON;
+               goto clean2;
+       }
+
        if ( op->o_callback ) {
                int             first = 1;
                slap_callback   *sc = op->o_callback,
@@ -568,7 +573,11 @@ slap_send_ldap_result( Operation *op, SlapReply *rs )
 
        rs->sr_type = REP_RESULT;
 
-       assert( !LDAP_API_ERROR( rs->sr_err ));
+       /* Propagate Abandons so that cleanup callbacks can be processed */
+       if ( rs->sr_err == SLAPD_ABANDON )
+               goto abandon;
+
+       assert( !LDAP_API_ERROR( rs->sr_err ) );
 
        Debug( LDAP_DEBUG_TRACE,
                "send_ldap_result: %s p=%d\n",
@@ -631,6 +640,7 @@ slap_send_ldap_result( Operation *op, SlapReply *rs )
        rs->sr_tag = req2res( op->o_tag );
        rs->sr_msgid = (rs->sr_tag != LBER_SEQUENCE) ? op->o_msgid : 0;
 
+abandon:
        if ( send_ldap_response( op, rs ) == SLAP_CB_CONTINUE ) {
                if ( op->o_tag == LDAP_REQ_SEARCH ) {
                        char nbuf[64];
@@ -781,11 +791,9 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
                /* read back control or LDAP_CONNECTIONLESS */
            ber = op->o_res_ber;
        } else {
-               ber_len_t       siz, len;
                struct berval   bv;
 
-               entry_flatsize( rs->sr_entry, &siz, &len, 0 );
-               bv.bv_len = siz + len;
+               bv.bv_len = entry_flatsize( rs->sr_entry, 0 );
                bv.bv_val = op->o_tmpalloc(bv.bv_len, op->o_tmpmemctx );
 
                ber_init2( ber, &bv, LBER_USE_DER );
@@ -1393,6 +1401,7 @@ slap_send_search_reference( Operation *op, SlapReply *rs )
                goto rel;
        }
 
+       rc = 0;
        if ( rs->sr_flags & REP_ENTRY_MUSTRELEASE ) {
                be_entry_release_rw( op, rs->sr_entry, 0 );
                rs->sr_flags ^= REP_ENTRY_MUSTRELEASE;
@@ -1507,7 +1516,6 @@ int slap_read_controls(
        BerElementBuffer berbuf;
        BerElement *ber = (BerElement *) &berbuf;
        LDAPControl c;
-       ber_len_t       siz, len;
        Operation myop;
 
        Debug( LDAP_DEBUG_ANY, "slap_read_controls: (%s) %s\n",
@@ -1517,8 +1525,7 @@ int slap_read_controls(
        rs->sr_attrs = ( oid == &slap_pre_read_bv ) ?
                op->o_preread_attrs : op->o_postread_attrs; 
 
-       entry_flatsize( rs->sr_entry, &siz, &len, 0 );
-       bv.bv_len = siz + len;
+       bv.bv_len = entry_flatsize( rs->sr_entry, 0 );
        bv.bv_val = op->o_tmpalloc(bv.bv_len, op->o_tmpmemctx );
 
        ber_init2( ber, &bv, LBER_USE_DER );