From d92e8ad1f75162cb8895af511c237bf5edcf0ea1 Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Sat, 15 Sep 2007 17:38:53 +0000 Subject: [PATCH] add helper for internal searchs for objectClass=* --- servers/slapd/acl.c | 16 ++++++++-------- servers/slapd/back-bdb/search.c | 18 +++--------------- servers/slapd/back-meta/conn.c | 7 ++----- servers/slapd/back-sql/delete.c | 7 ++----- servers/slapd/compare.c | 2 +- servers/slapd/filter.c | 23 +++++++++++++++++++++++ servers/slapd/init.c | 8 ++++++++ servers/slapd/main.c | 2 ++ servers/slapd/overlays/accesslog.c | 2 +- servers/slapd/overlays/dynlist.c | 9 ++------- servers/slapd/overlays/pcache.c | 24 ++++-------------------- servers/slapd/overlays/syncprov.c | 12 ++---------- servers/slapd/proto-slap.h | 5 +++++ servers/slapd/slap.h | 5 +++++ servers/slapd/syncrepl.c | 12 ++---------- 15 files changed, 70 insertions(+), 82 deletions(-) diff --git a/servers/slapd/acl.c b/servers/slapd/acl.c index 0bc7b0f268..8e9057ec68 100644 --- a/servers/slapd/acl.c +++ b/servers/slapd/acl.c @@ -2073,7 +2073,6 @@ acl_set_gather( SetCookie *cookie, struct berval *name, AttributeDescription *de slap_callback cb = { NULL, acl_set_cb_gather, NULL, NULL }; acl_set_gather_t p = { 0 }; const char *text = NULL; - static struct berval defaultFilter_bv = BER_BVC( "(objectClass=*)" ); /* this routine needs to return the bervals instead of * plain strings, since syntax is not known. It should @@ -2116,16 +2115,17 @@ acl_set_gather( SetCookie *cookie, struct berval *name, AttributeDescription *de if ( ludp->lud_filter ) { ber_str2bv_x( ludp->lud_filter, 0, 0, &op2.ors_filterstr, cp->asc_op->o_tmpmemctx ); + op2.ors_filter = str2filter_x( cp->asc_op, op2.ors_filterstr.bv_val ); + if ( op2.ors_filter == NULL ) { + rc = LDAP_PROTOCOL_ERROR; + goto url_done; + } } else { - op2.ors_filterstr = defaultFilter_bv; + op2.ors_filterstr = *slap_filterstr_objectClass_pres; + op2.ors_filter = slap_filter_objectClass_pres; } - op2.ors_filter = str2filter_x( cp->asc_op, op2.ors_filterstr.bv_val ); - if ( op2.ors_filter == NULL ) { - rc = LDAP_PROTOCOL_ERROR; - goto url_done; - } /* Grab the scope */ op2.ors_scope = ludp->lud_scope; @@ -2181,7 +2181,7 @@ acl_set_gather( SetCookie *cookie, struct berval *name, AttributeDescription *de } url_done:; - if ( op2.ors_filter ) { + if ( op2.ors_filter && op2.ors_filter != slap_filter_objectClass_pres ) { filter_free_x( cp->asc_op, op2.ors_filter ); } if ( !BER_BVISNULL( &op2.o_req_ndn ) ) { diff --git a/servers/slapd/back-bdb/search.c b/servers/slapd/back-bdb/search.c index 5f0f583c69..17c1a84a2e 100644 --- a/servers/slapd/back-bdb/search.c +++ b/servers/slapd/back-bdb/search.c @@ -154,11 +154,7 @@ static int search_aliases( Entry *matched, *a; EntryInfo *ei; struct berval bv_alias = BER_BVC( "alias" ); -#ifdef LDAP_COMP_MATCH - AttributeAssertion aa_alias = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion aa_alias = { NULL, BER_BVNULL }; -#endif + AttributeAssertion aa_alias = ATTRIBUTEASSERTION_INIT; Filter af; DB_LOCK locka, lockr; int first = 1; @@ -1028,17 +1024,9 @@ static int search_candidates( int rc, depth = 1; Filter f, rf, xf, nf; ID *stack; -#ifdef LDAP_COMP_MATCH - AttributeAssertion aa_ref = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion aa_ref = { NULL, BER_BVNULL }; -#endif + AttributeAssertion aa_ref = ATTRIBUTEASSERTION_INIT; Filter sf; -#ifdef LDAP_COMP_MATCH - AttributeAssertion aa_subentry = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion aa_subentry = { NULL, BER_BVNULL }; -#endif + AttributeAssertion aa_subentry = ATTRIBUTEASSERTION_INIT; /* * This routine takes as input a filter (user-filter) diff --git a/servers/slapd/back-meta/conn.c b/servers/slapd/back-meta/conn.c index e5d84842f8..ed7ff743cc 100644 --- a/servers/slapd/back-meta/conn.c +++ b/servers/slapd/back-meta/conn.c @@ -849,7 +849,6 @@ meta_back_get_candidate( rs->sr_text = "No suitable candidate target found"; } else if ( candidate == META_TARGET_MULTIPLE ) { - Filter f = { 0 }; Operation op2 = *op; SlapReply rs2 = { 0 }; slap_callback cb2 = { 0 }; @@ -868,10 +867,8 @@ meta_back_get_candidate( op2.ors_slimit = 1; op2.ors_tlimit = SLAP_NO_LIMIT; - f.f_choice = LDAP_FILTER_PRESENT; - f.f_desc = slap_schema.si_ad_objectClass; - op2.ors_filter = &f; - BER_BVSTR( &op2.ors_filterstr, "(objectClass=*)" ); + op2.ors_filter = slap_filter_objectClass_pres; + op2.ors_filterstr = *slap_filterstr_objectClass_pres; op2.o_callback = &cb2; cb2.sc_response = meta_back_conn_cb; diff --git a/servers/slapd/back-sql/delete.c b/servers/slapd/back-sql/delete.c index c04acb0a8d..15dd62a28a 100644 --- a/servers/slapd/back-sql/delete.c +++ b/servers/slapd/back-sql/delete.c @@ -336,7 +336,6 @@ backsql_tree_delete( Operation op2 = *op; slap_callback sc = { 0 }; SlapReply rs2 = { 0 }; - Filter f = { 0 }; backsql_tree_delete_t btd = { 0 }; int rc; @@ -368,10 +367,8 @@ backsql_tree_delete( op2.ors_deref = LDAP_DEREF_NEVER; op2.ors_slimit = SLAP_NO_LIMIT; op2.ors_tlimit = SLAP_NO_LIMIT; - op2.ors_filter = &f; - f.f_choice = LDAP_FILTER_PRESENT; - f.f_desc = slap_schema.si_ad_objectClass; - BER_BVSTR( &op2.ors_filterstr, "(objectClass=*)" ); + op2.ors_filter = slap_filter_objectClass_pres; + op2.ors_filterstr = *slap_filterstr_objectClass_pres; op2.ors_attrs = slap_anlist_all_attributes; op2.ors_attrsonly = 0; diff --git a/servers/slapd/compare.c b/servers/slapd/compare.c index 900f585fa4..eaee0c0e9b 100644 --- a/servers/slapd/compare.c +++ b/servers/slapd/compare.c @@ -44,7 +44,7 @@ do_compare( struct berval dn = BER_BVNULL; struct berval desc = BER_BVNULL; struct berval value = BER_BVNULL; - AttributeAssertion ava = { 0 }; + AttributeAssertion ava = ATTRIBUTEASSERTION_INIT; Debug( LDAP_DEBUG_TRACE, "%s do_compare\n", op->o_log_prefix, 0, 0 ); diff --git a/servers/slapd/filter.c b/servers/slapd/filter.c index d3ceb0b8a8..5eac384b75 100644 --- a/servers/slapd/filter.c +++ b/servers/slapd/filter.c @@ -33,6 +33,9 @@ #include "slap.h" +const Filter *slap_filter_objectClass_pres; +const struct berval *slap_filterstr_objectClass_pres; + static int get_filter_list( Operation *op, BerElement *ber, @@ -56,6 +59,26 @@ static int get_simple_vrFilter( ValuesReturnFilter **f, const char **text ); +int +filter_init( void ) +{ + static Filter filter_objectClass_pres = { LDAP_FILTER_PRESENT }; + static struct berval filterstr_objectClass_pres = BER_BVC("(objectClass=*)"); + + filter_objectClass_pres.f_desc = slap_schema.si_ad_objectClass; + + slap_filter_objectClass_pres = &filter_objectClass_pres; + slap_filterstr_objectClass_pres = &filterstr_objectClass_pres; + + return 0; +} + +void +filter_destroy( void ) +{ + return; +} + int get_filter( Operation *op, diff --git a/servers/slapd/init.c b/servers/slapd/init.c index 5666a49b99..28f30521c6 100644 --- a/servers/slapd/init.c +++ b/servers/slapd/init.c @@ -112,6 +112,14 @@ slap_init( int mode, const char *name ) return 1; } + if ( filter_init() != 0 ) { + slap_debug |= LDAP_DEBUG_NONE; + Debug( LDAP_DEBUG_ANY, + "%s: filter_init failed\n", + name, 0, 0 ); + return 1; + } + if ( entry_init() != 0 ) { slap_debug |= LDAP_DEBUG_NONE; Debug( LDAP_DEBUG_ANY, diff --git a/servers/slapd/main.c b/servers/slapd/main.c index 8c890e506d..86b61dd0e2 100644 --- a/servers/slapd/main.c +++ b/servers/slapd/main.c @@ -984,6 +984,8 @@ stop: controls_destroy(); + filter_destroy(); + schema_destroy(); lutil_passwd_destroy(); diff --git a/servers/slapd/overlays/accesslog.c b/servers/slapd/overlays/accesslog.c index 983395a8aa..b034d061cb 100644 --- a/servers/slapd/overlays/accesslog.c +++ b/servers/slapd/overlays/accesslog.c @@ -596,7 +596,7 @@ accesslog_purge( void *ctx, void *arg ) SlapReply rs = {REP_RESULT}; slap_callback cb = { NULL, log_old_lookup, NULL, NULL }; Filter f; - AttributeAssertion ava = {0}; + AttributeAssertion ava = ATTRIBUTEASSERTION_INIT; purge_data pd = {0}; char timebuf[LDAP_LUTIL_GENTIME_BUFSIZE]; char csnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE]; diff --git a/servers/slapd/overlays/dynlist.c b/servers/slapd/overlays/dynlist.c index 331d8691fd..b0468812cc 100644 --- a/servers/slapd/overlays/dynlist.c +++ b/servers/slapd/overlays/dynlist.c @@ -683,12 +683,8 @@ done:; goto release; } - BER_BVSTR( &o.ors_filterstr, "(objectClass=*)" ); - o.ors_filter = str2filter_x( op, o.ors_filterstr.bv_val ); - if ( o.ors_filter == NULL ) { - /* FIXME: error? */ - goto release; - } + o.ors_filterstr = *slap_filterstr_objectClass_pres; + o.ors_filter = slap_filter_objectClass_pres; o.ors_scope = LDAP_SCOPE_BASE; o.ors_deref = LDAP_DEREF_NEVER; @@ -701,7 +697,6 @@ done:; o.o_acl_priv = ACL_COMPARE; rc = o.o_bd->be_search( &o, &r ); - filter_free_x( &o, o.ors_filter ); if ( o.o_dn.bv_val != op->o_dn.bv_val ) { slap_op_groups_free( &o ); diff --git a/servers/slapd/overlays/pcache.c b/servers/slapd/overlays/pcache.c index 0e9b80df30..b6057d7aaa 100644 --- a/servers/slapd/overlays/pcache.c +++ b/servers/slapd/overlays/pcache.c @@ -1380,11 +1380,7 @@ remove_query_data( { struct query_info *qi, *qnext; char filter_str[ LDAP_LUTIL_UUIDSTR_BUFSIZE + STRLENOF( "(queryId=)" ) ]; -#ifdef LDAP_COMP_MATCH - AttributeAssertion ava = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion ava = { NULL, BER_BVNULL }; -#endif + AttributeAssertion ava = ATTRIBUTEASSERTION_INIT; Filter filter = {LDAP_FILTER_EQUALITY}; SlapReply sreply = {REP_RESULT}; slap_callback cb = { NULL, remove_func, NULL, NULL }; @@ -1665,11 +1661,7 @@ pcache_remove_entries_from_cache( SlapReply rs = { REP_RESULT }; Filter f = { 0 }; char filtbuf[ LDAP_LUTIL_UUIDSTR_BUFSIZE + STRLENOF( "(entryUUID=)" ) ]; -#ifdef LDAP_COMP_MATCH - AttributeAssertion ava = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion ava = { NULL, BER_BVNULL }; -#endif + AttributeAssertion ava = ATTRIBUTEASSERTION_INIT; AttributeName attrs[ 2 ] = { 0 }; int s, rc; @@ -1784,11 +1776,7 @@ pcache_remove_entry_queries_from_cache( SlapReply rs = { REP_RESULT }; Filter f = { 0 }; char filter_str[ LDAP_LUTIL_UUIDSTR_BUFSIZE + STRLENOF( "(queryId=)" ) ]; -#ifdef LDAP_COMP_MATCH - AttributeAssertion ava = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion ava = { NULL, BER_BVNULL }; -#endif + AttributeAssertion ava = ATTRIBUTEASSERTION_INIT; AttributeName attrs[ 2 ] = { 0 }; int rc; @@ -3192,11 +3180,7 @@ pcache_db_open( SlapReply rs = { 0 }; BerVarray vals = NULL; Filter f = { 0 }, f2 = { 0 }; -#ifdef LDAP_COMP_MATCH - AttributeAssertion ava = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion ava = { NULL, BER_BVNULL }; -#endif + AttributeAssertion ava = ATTRIBUTEASSERTION_INIT; AttributeName attrs[ 2 ] = { 0 }; connection_fake_init( &conn, &opbuf, thrctx ); diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index a817700622..bbdbf30085 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -585,11 +585,7 @@ syncprov_findcsn( Operation *op, find_csn_t mode ) char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE]; struct berval maxcsn; Filter cf; -#ifdef LDAP_COMP_MATCH - AttributeAssertion eq = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion eq = { NULL, BER_BVNULL }; -#endif + AttributeAssertion eq = ATTRIBUTEASSERTION_INIT; fpres_cookie pcookie; sync_control *srs = NULL; struct slap_limits_set fc_limits; @@ -1483,11 +1479,7 @@ syncprov_playlog( Operation *op, SlapReply *rs, sessionlog *sl, SlapReply frs = { REP_RESULT }; int rc; Filter mf, af; -#ifdef LDAP_COMP_MATCH - AttributeAssertion eq = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion eq; -#endif + AttributeAssertion eq = ATTRIBUTEASSERTION_INIT; slap_callback cb = {0}; fop = *op; diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index e3fae5ded0..ec130c4160 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -1016,6 +1016,11 @@ LDAP_SLAPD_F (int) filter_has_subordinates LDAP_P(( Filter *filter )); #define filter_escape_value( in, out ) ldap_bv2escaped_filter_value_x( (in), (out), 0, NULL ) #define filter_escape_value_x( in, out, ctx ) ldap_bv2escaped_filter_value_x( (in), (out), 0, ctx ) +LDAP_SLAPD_V (const Filter *) slap_filter_objectClass_pres; +LDAP_SLAPD_V (const struct berval *) slap_filterstr_objectClass_pres; + +LDAP_SLAPD_F (int) filter_init LDAP_P(( void )); +LDAP_SLAPD_F (void) filter_destroy LDAP_P(( void )); /* * filterentry.c */ diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 75aa25d1a9..b04ccd3f7a 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -979,6 +979,11 @@ struct AttributeAssertion { ComponentFilter *aa_cf; /* for attribute aliasing */ #endif }; +#ifdef LDAP_COMP_MATCH +#define ATTRIBUTEASSERTION_INIT { NULL, BER_BVNULL, NULL } +#else +#define ATTRIBUTEASSERTION_INIT { NULL, BER_BVNULL } +#endif struct SubstringsAssertion { AttributeDescription *sa_desc; diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index d41caa5200..af6de8893d 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -1840,11 +1840,7 @@ syncrepl_entry( SlapReply rs_add = {REP_RESULT}; SlapReply rs_modify = {REP_RESULT}; Filter f = {0}; -#ifdef LDAP_COMP_MATCH - AttributeAssertion ava = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion ava = { NULL, BER_BVNULL }; -#endif + AttributeAssertion ava = ATTRIBUTEASSERTION_INIT; int rc = LDAP_SUCCESS; struct berval pdn = BER_BVNULL; @@ -2264,11 +2260,7 @@ syncrepl_del_nonpresent( if ( uuids ) { Filter uf; -#ifdef LDAP_COMP_MATCH - AttributeAssertion eq = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion eq = { NULL, BER_BVNULL }; -#endif + AttributeAssertion eq = ATTRIBUTEASSERTION_INIT; int i; op->ors_attrsonly = 1; -- 2.39.5