]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/result.c
ITS#3796 fix IDL cache lock setup/teardown
[openldap] / servers / slapd / result.c
index 38bad417eba14a7146dcb1d46788a1d8e24629f8..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 );
@@ -1192,6 +1200,12 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
                goto error_return;
        }
 
+       if ( rs->sr_flags & REP_ENTRY_MUSTRELEASE ) {
+               be_entry_release_rw( op, rs->sr_entry, 0 );
+               rs->sr_flags ^= REP_ENTRY_MUSTRELEASE;
+               rs->sr_entry = NULL;
+       }
+
        if ( op->o_res_ber == NULL ) {
                bytes = send_ldap_ber( op->o_conn, ber );
                ber_free_buf( ber );
@@ -1214,7 +1228,7 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
        }
 
        Statslog( LDAP_DEBUG_STATS2, "%s ENTRY dn=\"%s\"\n",
-           op->o_log_prefix, rs->sr_entry->e_dn, 0, 0, 0 );
+           op->o_log_prefix, edn, 0, 0, 0 );
 
        Debug( LDAP_DEBUG_TRACE,
                "<= send_search_entry: conn %lu exit.\n", op->o_connid, 0, 0 );
@@ -1387,6 +1401,13 @@ 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;
+               rs->sr_entry = NULL;
+       }
+
 #ifdef LDAP_CONNECTIONLESS
        if (!op->o_conn || op->o_conn->c_is_udp == 0) {
 #endif
@@ -1495,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",
@@ -1505,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 );