]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/search.c
reset SlapReply flags
[openldap] / servers / slapd / back-ldap / search.c
index 62e4cc47c8da8d058b7ea6171434603047eede6f..6cf7697fdafc54bb1bcfbcfc0c8376e0797f407a 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2003 The OpenLDAP Foundation.
+ * Copyright 1999-2004 The OpenLDAP Foundation.
  * Portions Copyright 1999-2003 Howard Chu.
  * Portions Copyright 2000-2003 Pierangelo Masarati.
  * All rights reserved.
@@ -58,8 +58,6 @@ ldap_back_search(
        char **mapped_attrs = NULL;
        struct berval mbase;
        struct berval mfilter = { 0, NULL };
-       struct slap_limits_set *limit = NULL;
-       int isroot = 0;
        int dontfreetext = 0;
        dncookie dc;
 #ifdef LDAP_BACK_PROXY_AUTHZ
@@ -79,56 +77,11 @@ ldap_back_search(
                return( -1 );
        }
 
-       /* if not root, get appropriate limits */
-       if ( be_isroot( op->o_bd, &op->o_ndn ) ) {
-               isroot = 1;
-       } else {
-               ( void ) get_limits( op->o_bd, &op->o_ndn, &limit );
-       }
-       
-       /* if no time limit requested, rely on remote server limits */
-       /* if requested limit higher than hard limit, abort */
-       if ( !isroot && op->oq_search.rs_tlimit > limit->lms_t_hard ) {
-               /* no hard limit means use soft instead */
-               if ( limit->lms_t_hard == 0
-                               && limit->lms_t_soft > -1
-                               && op->oq_search.rs_tlimit > limit->lms_t_soft ) {
-                       op->oq_search.rs_tlimit = limit->lms_t_soft;
-                       
-               /* positive hard limit means abort */
-               } else if ( limit->lms_t_hard > 0 ) {
-                       rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED;
-                       rc = 0;
-                       goto finish;
-               }
-               
-               /* negative hard limit means no limit */
-       }
-       
-       /* if no size limit requested, rely on remote server limits */
-       /* if requested limit higher than hard limit, abort */
-       if ( !isroot && op->oq_search.rs_slimit > limit->lms_s_hard ) {
-               /* no hard limit means use soft instead */
-               if ( limit->lms_s_hard == 0
-                               && limit->lms_s_soft > -1
-                               && op->oq_search.rs_slimit > limit->lms_s_soft ) {
-                       op->oq_search.rs_slimit = limit->lms_s_soft;
-                       
-               /* positive hard limit means abort */
-               } else if ( limit->lms_s_hard > 0 ) {
-                       rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED;
-                       rc = 0;
-                       goto finish;
-               }
-               
-               /* negative hard limit means no limit */
-       }
-
        /* should we check return values? */
-       if (op->oq_search.rs_deref != -1)
-               ldap_set_option( lc->ld, LDAP_OPT_DEREF, (void *)&op->oq_search.rs_deref);
-       if (op->oq_search.rs_tlimit != -1) {
-               tv.tv_sec = op->oq_search.rs_tlimit;
+       if (op->ors_deref != -1)
+               ldap_set_option( lc->ld, LDAP_OPT_DEREF, (void *)&op->ors_deref);
+       if (op->ors_tlimit != -1) {
+               tv.tv_sec = op->ors_tlimit;
                tv.tv_usec = 0;
        } else {
                tv.tv_sec = 0;
@@ -146,15 +99,25 @@ ldap_back_search(
        dc.tofrom = 1;
        dc.normalized = 0;
 #endif
-       if ( ldap_back_dn_massage( &dc, &op->o_req_dn, &mbase ) ) {
+       if ( ldap_back_dn_massage( &dc, &op->o_req_ndn, &mbase ) ) {
                send_ldap_result( op, rs );
                return -1;
        }
 
-       rc = ldap_back_filter_map_rewrite( &dc, op->oq_search.rs_filter,
+       rc = ldap_back_filter_map_rewrite( &dc, op->ors_filter,
                        &mfilter, BACKLDAP_MAP );
 
-       if ( rc ) {
+       switch ( rc ) {
+       case LDAP_SUCCESS:
+               break;
+
+       case LDAP_COMPARE_FALSE:
+               rs->sr_err = LDAP_SUCCESS;
+               rs->sr_text = NULL;
+               rc = 0;
+               goto finish;
+
+       default:
                rs->sr_err = LDAP_OTHER;
                rs->sr_text = "Rewrite error";
                dontfreetext = 1;
@@ -163,7 +126,7 @@ ldap_back_search(
        }
 
        rs->sr_err = ldap_back_map_attrs( &li->rwmap.rwm_at,
-                       op->oq_search.rs_attrs,
+                       op->ors_attrs,
                        BACKLDAP_MAP, &mapped_attrs );
        if ( rs->sr_err ) {
                rc = -1;
@@ -179,15 +142,15 @@ ldap_back_search(
 #endif /* LDAP_BACK_PROXY_AUTHZ */
        
        rs->sr_err = ldap_search_ext(lc->ld, mbase.bv_val,
-                       op->oq_search.rs_scope, mfilter.bv_val,
-                       mapped_attrs, op->oq_search.rs_attrsonly,
+                       op->ors_scope, mfilter.bv_val,
+                       mapped_attrs, op->ors_attrsonly,
 #ifdef LDAP_BACK_PROXY_AUTHZ
                        ctrls,
 #else /* ! LDAP_BACK_PROXY_AUTHZ */
                        op->o_ctrls,
 #endif /* ! LDAP_BACK_PROXY_AUTHZ */
                        NULL,
-                       tv.tv_sec ? &tv : NULL, op->oq_search.rs_slimit,
+                       tv.tv_sec ? &tv : NULL, op->ors_slimit,
                        &msgid );
 
        if ( rs->sr_err != LDAP_SUCCESS ) {
@@ -218,12 +181,14 @@ fail:;
                } else if (rc == LDAP_RES_SEARCH_ENTRY) {
                        Entry ent = {0};
                        struct berval bdn;
+                       int abort = 0;
                        e = ldap_first_entry(lc->ld,res);
-                       if ( ldap_build_entry(op, e, &ent, &bdn,
-                                               LDAP_BUILD_ENTRY_PRIVATE) == LDAP_SUCCESS ) {
+                       if ( ( rc = ldap_build_entry(op, e, &ent, &bdn,
+                                               LDAP_BUILD_ENTRY_PRIVATE)) == LDAP_SUCCESS ) {
                                rs->sr_entry = &ent;
-                               rs->sr_attrs = op->oq_search.rs_attrs;
-                               send_search_entry( op, rs );
+                               rs->sr_attrs = op->ors_attrs;
+                               rs->sr_flags = 0;
+                               abort = send_search_entry( op, rs );
                                while (ent.e_attrs) {
                                        Attribute *a;
                                        BerVarray v;
@@ -245,6 +210,10 @@ fail:;
                                        free( ent.e_ndn );
                        }
                        ldap_msgfree(res);
+                       if ( abort ) {
+                               ldap_abandon(lc->ld, msgid);
+                               goto finish;
+                       }
 
                } else if ( rc == LDAP_RES_SEARCH_REFERENCE ) {
                        char            **references = NULL;
@@ -307,7 +276,7 @@ fail:;
                struct berval mdn;
 
 #ifdef ENABLE_REWRITE
-               dc.ctx = "matchedDn";
+               dc.ctx = "matchedDN";
 #else
                dc.tofrom = 0;
                dc.normalized = 0;
@@ -346,10 +315,10 @@ finish:;
        if ( mapped_attrs ) {
                ch_free( mapped_attrs );
        }
-       if ( mfilter.bv_val != op->oq_search.rs_filterstr.bv_val ) {
+       if ( mfilter.bv_val != op->ors_filterstr.bv_val ) {
                ch_free( mfilter.bv_val );
        }
-       if ( mbase.bv_val != op->o_req_dn.bv_val ) {
+       if ( mbase.bv_val != op->o_req_ndn.bv_val ) {
                free( mbase.bv_val );
        }