Avlnode *list;
int step;
int slimit;
+ AttributeName *attrs;
} trans_ctx;
static int translucent_search_cb(Operation *op, SlapReply *rs) {
Debug(LDAP_DEBUG_TRACE, "==> translucent_search_cb: %s\n",
rs->sr_entry->e_name.bv_val, 0, 0);
- op->ors_slimit = tc->slimit;
+ op->ors_slimit = tc->slimit + ( tc->slimit > 0 ? 1 : 0 );
+ if ( op->ors_attrs == slap_anlist_all_attributes ) {
+ op->ors_attrs = tc->attrs;
+ rs->sr_attrs = tc->attrs;
+ rs->sr_attr_flags = slap_attr_flags( rs->sr_attrs );
+ }
on = tc->on;
ov = on->on_bi.bi_private;
if ( rc == LDAP_COMPARE_TRUE ) {
rs->sr_flags |= REP_ENTRY_MUSTBEFREED;
rs->sr_entry = re;
+
+ if ( tc->slimit >= 0 && rs->sr_nentries >= tc->slimit ) {
+ return LDAP_SIZELIMIT_EXCEEDED;
+ }
+
return SLAP_CB_CONTINUE;
} else {
entry_free( re );
for(ax = le->e_attrs; ax; ax = ax->a_next) {
for(a = re->e_attrs; a; a = a->a_next) {
if(a->a_desc == ax->a_desc) {
+ test_f = 1;
if(a->a_vals != a->a_nvals)
ber_bvarray_free(a->a_nvals);
ber_bvarray_free(a->a_vals);
}
op->o_bd = db;
+
+ if ( rc == SLAP_CB_CONTINUE && tc->slimit >= 0 && rs->sr_nentries >= tc->slimit ) {
+ return LDAP_SIZELIMIT_EXCEEDED;
+ }
+
return rc;
}
tc.orig = op->ors_filter;
tc.list = NULL;
tc.step = 0;
+ tc.slimit = op->ors_slimit;
+ tc.attrs = NULL;
fbv = op->ors_filterstr;
op->o_callback = &cb;
if ( fr || !fl ) {
- AttributeName *attrs = op->ors_attrs;
- tc.slimit = op->ors_slimit;
+ tc.attrs = op->ors_attrs;
op->ors_slimit = SLAP_NO_LIMIT;
- op->ors_attrs = NULL;
+ op->ors_attrs = slap_anlist_all_attributes;
op->o_bd = &ov->db;
tc.step |= RMT_SIDE;
if ( fl ) {
filter2bv_x( op, fr, &op->ors_filterstr );
}
rc = ov->db.bd_info->bi_op_search(op, rs);
- op->ors_slimit = tc.slimit;
- op->ors_attrs = attrs;
+ op->ors_attrs = tc.attrs;
op->o_bd = tc.db;
if ( fl ) {
op->o_tmpfree( op->ors_filterstr.bv_val, op->o_tmpmemctx );
op->ors_filter = tc.orig;
op->o_callback = cb.sc_next;
rs->sr_attrs = op->ors_attrs;
+ rs->sr_attr_flags = slap_attr_flags( rs->sr_attrs );
/* Send out anything remaining on the list and finish */
if ( tc.step & USE_LIST ) {
send_ldap_result( op, rs );
}
+ op->ors_slimit = tc.slimit;
+
/* Free in reverse order */
if ( fl )
trans_filter_free( op, fl );