]> 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 1f87393182191f24f05599c87afd41d16eadf46b..97c5cf385723a7b4225ce032140c2531bea0ec10 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2004 The OpenLDAP Foundation.
+ * Copyright 1998-2005 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -254,7 +254,9 @@ send_ldap_controls( Operation *o, BerElement *ber, LDAPControl **c )
         * plugin.
         */
 
-       if ( o->o_pb && slapi_pblock_get( o->o_pb, SLAPI_RESCONTROLS, &sctrls ) != 0 ) {
+       if ( o->o_pb &&
+               slapi_pblock_get( o->o_pb, SLAPI_RESCONTROLS, &sctrls ) != 0 )
+       {
                sctrls = NULL;
        }
 
@@ -269,10 +271,37 @@ send_ldap_controls( Operation *o, BerElement *ber, LDAPControl **c )
 #ifdef LDAP_SLAPI
        if ( c != NULL )
 #endif /* LDAP_SLAPI */
-       for( ; *c != NULL; c++) {
-               rc = send_ldap_control( ber, *c );
+       {
+               for( ; *c != NULL; c++) {
+                       rc = send_ldap_control( ber, *c );
+                       if( rc == -1 ) return rc;
+               }
+       }
+
+#ifdef LDAP_DEVEL
+       /* this is a hack to avoid having to modify op->s_ctrls */
+       if( o->o_sortedresults ) {
+               BerElementBuffer berbuf;
+               BerElement *sber = (BerElement *) &berbuf;
+               LDAPControl sorted;
+               BER_BVZERO( &sorted.ldctl_value );
+               sorted.ldctl_oid = LDAP_CONTROL_SORTRESPONSE;
+               sorted.ldctl_iscritical = 0;
+
+               ber_init2( sber, NULL, LBER_USE_DER );
+
+               ber_printf( sber, "{i}", LDAP_UNWILLING_TO_PERFORM );
+
+               if( ber_flatten2( ber, &sorted.ldctl_value, 0 ) == -1 ) {
+                       return LBER_ERROR;
+               }
+
+               (void) ber_free_buf( ber );
+
+               rc = send_ldap_control( ber, &sorted );
                if( rc == -1 ) return rc;
        }
+#endif
 
 #ifdef LDAP_SLAPI
        if ( sctrls != NULL ) {
@@ -298,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,
@@ -381,11 +415,15 @@ send_ldap_response(
        {
                if ( rs->sr_rspoid != NULL ) {
                        rc = ber_printf( ber, "ts",
-                               LDAP_TAG_EXOP_RES_OID, rs->sr_rspoid );
+                               rs->sr_type == REP_EXTENDED
+                                       ? LDAP_TAG_EXOP_RES_OID : LDAP_TAG_IM_RES_OID,
+                               rs->sr_rspoid );
                }
                if( rc != -1 && rs->sr_rspdata != NULL ) {
                        rc = ber_printf( ber, "tO",
-                               LDAP_TAG_EXOP_RES_VALUE, rs->sr_rspdata );
+                               rs->sr_type == REP_EXTENDED
+                                       ? LDAP_TAG_EXOP_RES_VALUE : LDAP_TAG_IM_RES_VALUE,
+                               rs->sr_rspdata );
                }
        }
 
@@ -448,13 +486,8 @@ send_ldap_response(
 #endif /* LDAP_SLAPI */
 
        ldap_pvt_thread_mutex_lock( &slap_counters.sc_sent_mutex );
-#ifdef HAVE_GMP
-       mpz_add_ui( slap_counters.sc_pdu, slap_counters.sc_pdu, 1 );
-       mpz_add_ui( slap_counters.sc_bytes, slap_counters.sc_bytes, bytes );
-#else /* ! HAVE_GMP */
-       slap_counters.sc_bytes += bytes;
-       slap_counters.sc_pdu++;
-#endif /* ! HAVE_GMP */
+       ldap_pvt_mp_add_ulong( slap_counters.sc_pdu, 1 );
+       ldap_pvt_mp_add_ulong( slap_counters.sc_bytes, (unsigned long)bytes );
        ldap_pvt_thread_mutex_unlock( &slap_counters.sc_sent_mutex );
 
 cleanup:;
@@ -466,20 +499,18 @@ cleanup:;
 clean2:;
        if ( op->o_callback ) {
                int             first = 1;
-               slap_callback   *sc = op->o_callback,
-                               *sc_next = op->o_callback;
+               slap_callback   *sc = op->o_callback, *sc_next;
 
                for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
                        sc_next = op->o_callback->sc_next;
                        if ( op->o_callback->sc_cleanup ) {
                                (void)op->o_callback->sc_cleanup( op, rs );
-                               if ( first && op->o_callback == NULL ) {
-                                       sc = NULL;
+                               if ( first && op->o_callback != sc ) {
+                                       sc = op->o_callback;
                                }
                        }
                        first = 0;
                }
-
                op->o_callback = sc;
        }
 
@@ -527,9 +558,9 @@ send_ldap_disconnect( Operation     *op, SlapReply *rs )
 
        if ( send_ldap_response( op, rs ) == SLAP_CB_CONTINUE ) {
                Statslog( LDAP_DEBUG_STATS,
-                       "conn=%lu op=%lu DISCONNECT tag=%lu err=%d text=%s\n",
-                       op->o_connid, op->o_opid, rs->sr_tag, rs->sr_err,
-                       rs->sr_text ? rs->sr_text : "" );
+                       "%s DISCONNECT tag=%lu err=%d text=%s\n",
+                       op->o_log_prefix, rs->sr_tag, rs->sr_err,
+                       rs->sr_text ? rs->sr_text : "", 0 );
        }
 }
 
@@ -542,11 +573,15 @@ 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: conn=%lu op=%lu p=%d\n",
-               op->o_connid, op->o_opid, op->o_protocol );
+               "send_ldap_result: %s p=%d\n",
+               op->o_log_prefix, op->o_protocol, 0 );
 
        Debug( LDAP_DEBUG_ARGS,
                "send_ldap_result: err=%d matched=\"%s\" text=\"%s\"\n",
@@ -582,7 +617,7 @@ slap_send_ldap_result( Operation *op, SlapReply *rs )
         * should just set SLAPI_RESULT_CODE rather than sending a
         * result if they wish to change the result.
         */
-       if ( op->o_pb != NULL ) {
+       if ( op->o_callback == NULL && op->o_pb != NULL ) {
                slapi_int_pblock_set_operation( op->o_pb, op );
                slapi_pblock_set( op->o_pb, SLAPI_RESULT_CODE,
                        (void *)rs->sr_err );
@@ -605,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];
@@ -612,14 +648,14 @@ slap_send_ldap_result( Operation *op, SlapReply *rs )
                                rs->sr_err, rs->sr_nentries );
 
                        Statslog( LDAP_DEBUG_STATS,
-                       "conn=%lu op=%lu SEARCH RESULT tag=%lu err=%s text=%s\n",
-                               op->o_connid, op->o_opid, rs->sr_tag, nbuf,
-                               rs->sr_text ? rs->sr_text : "" );
+                       "%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 );
                } else {
                        Statslog( LDAP_DEBUG_STATS,
-                               "conn=%lu op=%lu RESULT tag=%lu err=%d text=%s\n",
-                               op->o_connid, op->o_opid, rs->sr_tag, rs->sr_err,
-                               rs->sr_text ? rs->sr_text : "" );
+                               "%s RESULT tag=%lu err=%d text=%s\n",
+                               op->o_log_prefix, rs->sr_tag, rs->sr_err,
+                               rs->sr_text ? rs->sr_text : "", 0 );
                }
        }
 
@@ -755,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 );
@@ -1166,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 );
@@ -1181,20 +1221,14 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
                rs->sr_nentries++;
 
                ldap_pvt_thread_mutex_lock( &slap_counters.sc_sent_mutex );
-#ifdef HAVE_GMP
-               mpz_add_ui( slap_counters.sc_bytes, slap_counters.sc_bytes, bytes );
-               mpz_add_ui( slap_counters.sc_entries, slap_counters.sc_entries, 1 );
-               mpz_add_ui( slap_counters.sc_pdu, slap_counters.sc_pdu, 1 );
-#else /* ! HAVE_GMP */
-               slap_counters.sc_bytes += bytes;
-               slap_counters.sc_entries++;
-               slap_counters.sc_pdu++;
-#endif /* ! HAVE_GMP */
+               ldap_pvt_mp_add_ulong( slap_counters.sc_bytes, (unsigned long)bytes );
+               ldap_pvt_mp_add_ulong( slap_counters.sc_entries, 1 );
+               ldap_pvt_mp_add_ulong( slap_counters.sc_pdu, 1 );
                ldap_pvt_thread_mutex_unlock( &slap_counters.sc_sent_mutex );
        }
 
-       Statslog( LDAP_DEBUG_STATS2, "conn=%lu op=%lu ENTRY dn=\"%s\"\n",
-           op->o_connid, op->o_opid, rs->sr_entry->e_dn, 0, 0 );
+       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 );
@@ -1204,20 +1238,18 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
 error_return:;
        if ( op->o_callback ) {
                int             first = 1;
-               slap_callback   *sc = op->o_callback,
-                               *sc_next = op->o_callback;
+               slap_callback   *sc = op->o_callback, *sc_next;
 
                for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
                        sc_next = op->o_callback->sc_next;
                        if ( op->o_callback->sc_cleanup ) {
                                (void)op->o_callback->sc_cleanup( op, rs );
-                               if ( first && op->o_callback == NULL ) {
-                                       sc = NULL;
+                               if ( first && op->o_callback != sc ) {
+                                       sc = op->o_callback;
                                }
                        }
                        first = 0;
                }
-
                op->o_callback = sc;
        }
 
@@ -1369,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
@@ -1376,42 +1415,35 @@ slap_send_search_reference( Operation *op, SlapReply *rs )
        ber_free_buf( ber );
 
        ldap_pvt_thread_mutex_lock( &slap_counters.sc_sent_mutex );
-#ifdef HAVE_GMP
-       mpz_add_ui( slap_counters.sc_bytes, slap_counters.sc_bytes, bytes );
-       mpz_add_ui( slap_counters.sc_refs, slap_counters.sc_refs, 1 );
-       mpz_add_ui( slap_counters.sc_pdu, slap_counters.sc_pdu, 1 );
-#else /* ! HAVE_GMP */
-       slap_counters.sc_bytes += bytes;
-       slap_counters.sc_refs++;
-       slap_counters.sc_pdu++;
-#endif /* ! HAVE_GMP */
+       ldap_pvt_mp_add_ulong( slap_counters.sc_bytes, (unsigned long)bytes );
+       ldap_pvt_mp_add_ulong( slap_counters.sc_refs, 1 );
+       ldap_pvt_mp_add_ulong( slap_counters.sc_pdu, 1 );
        ldap_pvt_thread_mutex_unlock( &slap_counters.sc_sent_mutex );
 #ifdef LDAP_CONNECTIONLESS
        }
 #endif
 
-       Statslog( LDAP_DEBUG_STATS2, "conn=%lu op=%lu REF dn=\"%s\"\n",
-               op->o_connid, op->o_opid, rs->sr_entry ? rs->sr_entry->e_dn : "(null)", 0, 0 );
+       Statslog( LDAP_DEBUG_STATS2, "%s REF dn=\"%s\"\n",
+               op->o_log_prefix, rs->sr_entry ? rs->sr_entry->e_dn : "(null)",
+               0, 0, 0 );
 
        Debug( LDAP_DEBUG_TRACE, "<= send_search_reference\n", 0, 0, 0 );
 
 rel:
        if ( op->o_callback ) {
                int             first = 1;
-               slap_callback   *sc = op->o_callback,
-                               *sc_next = op->o_callback;
+               slap_callback   *sc = op->o_callback, *sc_next;
 
                for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
                        sc_next = op->o_callback->sc_next;
                        if ( op->o_callback->sc_cleanup ) {
                                (void)op->o_callback->sc_cleanup( op, rs );
-                               if ( first && op->o_callback == NULL ) {
-                                       sc = NULL;
+                               if ( first && op->o_callback != sc ) {
+                                       sc = op->o_callback;
                                }
                        }
                        first = 0;
                }
-
                op->o_callback = sc;
        }
 
@@ -1423,8 +1455,7 @@ str2result(
     char       *s,
     int                *code,
     char       **matched,
-    char       **info
-)
+    char       **info )
 {
        int     rc;
        char    *c;
@@ -1485,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",
@@ -1495,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 );
@@ -1522,7 +1551,7 @@ int slap_read_controls(
                *ctrl = (LDAPControl *) slap_sl_calloc( 1, sizeof(LDAPControl), NULL );
        } else {
                /* retry: free previous try */
-               slap_sl_free( (*ctrl)->ldctl_value.bv_val, &op->o_tmpmemctx );
+               slap_sl_free( (*ctrl)->ldctl_value.bv_val, op->o_tmpmemctx );
        }
 
        **ctrl = c;
@@ -1585,8 +1614,10 @@ slap_attr_flags( AttributeName *an )
                flags |= ( SLAP_OPATTRS_NO | SLAP_USERATTRS_YES );
 
        } else {
-               flags |= an_find( an, &AllOper ) ?  SLAP_OPATTRS_YES : SLAP_OPATTRS_NO;
-               flags |= an_find( an, &AllUser ) ?  SLAP_USERATTRS_YES : SLAP_USERATTRS_NO;
+               flags |= an_find( an, &AllOper )
+                       ? SLAP_OPATTRS_YES : SLAP_OPATTRS_NO;
+               flags |= an_find( an, &AllUser )
+                       ? SLAP_USERATTRS_YES : SLAP_USERATTRS_NO;
        }
 
        return flags;