]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/result.c
fix previous commit (ITS#5819)
[openldap] / servers / slapd / result.c
index 7be8d952494c4f50a856de25e982e7e63e31f708..a2e7343eb6ceca4568d990848114e4a317525405 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2007 The OpenLDAP Foundation.
+ * Copyright 1998-2008 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -522,14 +522,28 @@ clean2:;
                (void)slap_cleanup_play( op, rs );
        }
 
-       if ( rs->sr_matched && rs->sr_flags & REP_MATCHED_MUSTBEFREED ) {
-               free( (char *)rs->sr_matched );
-               rs->sr_matched = NULL;
+       if ( rs->sr_flags & REP_MATCHED_MUSTBEFREED ) {
+               rs->sr_flags ^= REP_MATCHED_MUSTBEFREED; /* paranoia */
+               if ( rs->sr_matched ) {
+                       free( (char *)rs->sr_matched );
+                       rs->sr_matched = NULL;
+               }
        }
 
-       if ( rs->sr_ref && rs->sr_flags & REP_REF_MUSTBEFREED ) {
-               ber_bvarray_free( rs->sr_ref );
-               rs->sr_ref = NULL;
+       if ( rs->sr_flags & REP_REF_MUSTBEFREED ) {
+               rs->sr_flags ^= REP_REF_MUSTBEFREED; /* paranoia */
+               if ( rs->sr_ref ) {
+                       ber_bvarray_free( rs->sr_ref );
+                       rs->sr_ref = NULL;
+               }
+       }
+
+       if ( rs->sr_flags & REP_CTRLS_MUSTBEFREED ) {
+               rs->sr_flags ^= REP_CTRLS_MUSTBEFREED; /* paranoia */
+               if ( rs->sr_ctrls ) {
+                       slap_free_ctrls( op, rs->sr_ctrls );
+                       rs->sr_ctrls = NULL;
+               }
        }
 
        return rc;
@@ -621,20 +635,24 @@ slap_send_ldap_result( Operation *op, SlapReply *rs )
                rs->sr_ref = NULL;
        }
 
+abandon:
        rs->sr_tag = slap_req2res( op->o_tag );
        rs->sr_msgid = (rs->sr_tag != LBER_SEQUENCE) ? op->o_msgid : 0;
 
-abandon:
+       if ( rs->sr_flags & REP_REF_MUSTBEFREED ) {
+               if ( rs->sr_ref == NULL ) {
+                       rs->sr_flags ^= REP_REF_MUSTBEFREED;
+                       ber_bvarray_free( oref );
+               }
+               oref = NULL; /* send_ldap_response() will free rs->sr_ref if != NULL */
+       }
+
        if ( send_ldap_response( op, rs ) == SLAP_CB_CONTINUE ) {
                if ( op->o_tag == LDAP_REQ_SEARCH ) {
-                       char nbuf[64];
-                       snprintf( nbuf, sizeof nbuf, "%d nentries=%d",
-                               rs->sr_err, rs->sr_nentries );
-
                        Statslog( LDAP_DEBUG_STATS,
-                       "%s SEARCH RESULT tag=%lu err=%s text=%s\n",
-                               op->o_log_prefix, rs->sr_tag, nbuf,
-                               rs->sr_text ? rs->sr_text : "", 0 );
+                               "%s SEARCH RESULT tag=%lu err=%d nentries=%d text=%s\n",
+                               op->o_log_prefix, rs->sr_tag, rs->sr_err,
+                               rs->sr_nentries, rs->sr_text ? rs->sr_text : "" );
                } else {
                        Statslog( LDAP_DEBUG_STATS,
                                "%s RESULT tag=%lu err=%d text=%s\n",
@@ -725,7 +743,6 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
        BerElement      *ber = (BerElement *) &berbuf;
        Attribute       *a;
        int             i, j, rc = LDAP_UNAVAILABLE, bytes;
-       char            *edn;
        int             userattrs;
        AccessControlState acl_state = ACL_STATE_INIT;
        int                      attrsonly;
@@ -742,9 +759,9 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
        }
 
        /* Every 64 entries, check for thread pool pause */
-       if (( rs->sr_nentries & 0x3f == 0x3f ) &&
-               ldap_pvt_thread_pool_query( &connection_pool,
-                       LDAP_PVT_THREAD_POOL_PARAM_PAUSING, &i ) == 0 && i ) {
+       if ( ( ( rs->sr_nentries & 0x3f ) == 0x3f ) &&
+               ldap_pvt_thread_pool_pausing( &connection_pool ) > 0 )
+       {
                return LDAP_BUSY;
        }
 
@@ -788,8 +805,6 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
                goto error_return;
        }
 
-       edn = rs->sr_entry->e_nname.bv_val;
-
        if ( op->o_res_ber ) {
                /* read back control or LDAP_CONNECTIONLESS */
            ber = op->o_res_ber;
@@ -897,12 +912,16 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
                } else {
                        /* specific attrs requested */
                        if ( is_at_operational( desc->ad_type ) ) {
-                               if ( !SLAP_OPATTRS( rs->sr_attr_flags ) &&
-                                       !ad_inlist( desc, rs->sr_attrs ) )
-                               {
-                                       continue;
+                               /* if not explicitly requested */
+                               if ( !ad_inlist( desc, rs->sr_attrs )) {
+                                       /* if not all op attrs requested, skip */
+                                       if ( !SLAP_OPATTRS( rs->sr_attr_flags ))
+                                               continue;
+                                       /* if DSA-specific and replicating, skip */
+                                       if ( op->o_sync != SLAP_CONTROL_NONE &&
+                                               desc->ad_type->sat_usage == LDAP_SCHEMA_DSA_OPERATION )
+                                               continue;
                                }
-
                        } else {
                                if ( !userattrs && !ad_inlist( desc, rs->sr_attrs ) ) {
                                        continue;
@@ -1172,6 +1191,9 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
                goto error_return;
        }
 
+       Statslog( LDAP_DEBUG_STATS2, "%s ENTRY dn=\"%s\"\n",
+           op->o_log_prefix, rs->sr_entry->e_nname.bv_val, 0, 0, 0 );
+
        if ( rs->sr_flags & REP_ENTRY_MUSTRELEASE ) {
                be_entry_release_rw( op, rs->sr_entry, 0 );
                rs->sr_flags ^= REP_ENTRY_MUSTRELEASE;
@@ -1199,9 +1221,6 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
                ldap_pvt_thread_mutex_unlock( &op->o_counters->sc_mutex );
        }
 
-       Statslog( LDAP_DEBUG_STATS2, "%s ENTRY dn=\"%s\"\n",
-           op->o_log_prefix, edn, 0, 0, 0 );
-
        Debug( LDAP_DEBUG_TRACE,
                "<= send_search_entry: conn %lu exit.\n", op->o_connid, 0, 0 );
 
@@ -1247,6 +1266,7 @@ slap_send_search_reference( Operation *op, SlapReply *rs )
        BerElement      *ber = (BerElement *) &berbuf;
        int rc = 0;
        int bytes;
+       char *edn = rs->sr_entry ? rs->sr_entry->e_name.bv_val : "(null)";
 
        AttributeDescription *ad_ref = slap_schema.si_ad_ref;
        AttributeDescription *ad_entry = slap_schema.si_ad_entry;
@@ -1261,7 +1281,7 @@ slap_send_search_reference( Operation *op, SlapReply *rs )
 
        Debug( LDAP_DEBUG_TRACE,
                "=> send_search_reference: dn=\"%s\"\n",
-               rs->sr_entry ? rs->sr_entry->e_name.bv_val : "(null)", 0, 0 );
+               edn, 0, 0 );
 
        if (  rs->sr_entry && ! access_allowed( op, rs->sr_entry,
                ad_entry, NULL, ACL_READ, NULL ) )
@@ -1287,7 +1307,7 @@ slap_send_search_reference( Operation *op, SlapReply *rs )
        if( op->o_domain_scope ) {
                Debug( LDAP_DEBUG_ANY,
                        "send_search_reference: domainScope control in (%s)\n", 
-                       rs->sr_entry->e_dn, 0, 0 );
+                       edn, 0, 0 );
                rc = 0;
                goto rel;
        }
@@ -1295,7 +1315,7 @@ slap_send_search_reference( Operation *op, SlapReply *rs )
        if( rs->sr_ref == NULL ) {
                Debug( LDAP_DEBUG_ANY,
                        "send_search_reference: null ref in (%s)\n", 
-                       rs->sr_entry ? rs->sr_entry->e_dn : "(null)", 0, 0 );
+                       edn, 0, 0 );
                rc = 1;
                goto rel;
        }
@@ -1345,6 +1365,7 @@ slap_send_search_reference( Operation *op, SlapReply *rs )
 
        rc = 0;
        if ( rs->sr_flags & REP_ENTRY_MUSTRELEASE ) {
+               assert( rs->sr_entry != NULL );
                be_entry_release_rw( op, rs->sr_entry, 0 );
                rs->sr_flags ^= REP_ENTRY_MUSTRELEASE;
                rs->sr_entry = NULL;
@@ -1494,8 +1515,8 @@ int slap_read_controls(
        LDAPControl c;
        Operation myop;
 
-       Debug( LDAP_DEBUG_ANY, "slap_read_controls: (%s) %s\n",
-               oid->bv_val, e->e_dn, 0 );
+       Debug( LDAP_DEBUG_ANY, "%s slap_read_controls: (%s) %s\n",
+               op->o_log_prefix, oid->bv_val, e->e_dn );
 
        rs->sr_entry = e;
        rs->sr_attrs = ( oid == &slap_pre_read_bv ) ?
@@ -1520,7 +1541,7 @@ int slap_read_controls(
 
        rc = ber_flatten2( ber, &c.ldctl_value, 0 );
 
-       if( rc == LBER_ERROR ) return LDAP_OTHER;
+       if( rc == -1 ) return LDAP_OTHER;
 
        c.ldctl_oid = oid->bv_val;
        c.ldctl_iscritical = 0;