X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Ffilter.c;h=5eac384b758ee3fba02c63ce3ac4b6b2671c3e12;hb=24db207196a453a4f9acdce08593c7e0ed53ce4c;hp=2c6274430e3d3f7f2796f36bd88a6b8b2fa6b783;hpb=3bf226382e856d540e52a3fc732fc449e0f04d42;p=openldap diff --git a/servers/slapd/filter.c b/servers/slapd/filter.c index 2c6274430e..5eac384b75 100644 --- a/servers/slapd/filter.c +++ b/servers/slapd/filter.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2006 The OpenLDAP Foundation. + * Copyright 1998-2007 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -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, @@ -167,7 +190,9 @@ get_filter( if( err != LDAP_SUCCESS ) { f.f_choice |= SLAPD_FILTER_UNDEFINED; - err = slap_bv2undef_ad( &type, &f.f_desc, text, SLAP_AD_PROXIED); + err = slap_bv2undef_ad( &type, &f.f_desc, text, + SLAP_AD_PROXIED|SLAP_AD_NOINSERT ); + if ( err != LDAP_SUCCESS ) { /* unrecognized attribute description or other error */ Debug( LDAP_DEBUG_ANY, @@ -176,6 +201,7 @@ get_filter( op->o_connid, type.bv_val, err ); err = LDAP_SUCCESS; + f.f_desc = slap_bv2tmp_ad( &type, op->o_tmpmemctx ); } *text = NULL; } @@ -344,19 +370,15 @@ get_ssa( if( rc != LDAP_SUCCESS ) { f->f_choice |= SLAPD_FILTER_UNDEFINED; - rc = slap_bv2undef_ad( &desc, &ssa.sa_desc, text, SLAP_AD_PROXIED); + rc = slap_bv2undef_ad( &desc, &ssa.sa_desc, text, + SLAP_AD_PROXIED|SLAP_AD_NOINSERT ); + if( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, "get_ssa: conn %lu unknown attribute type=%s (%ld)\n", op->o_connid, desc.bv_val, (long) rc ); - /* skip over the rest of this filter */ - for ( tag = ber_first_element( ber, &len, &last ); - tag != LBER_DEFAULT; - tag = ber_next_element( ber, &len, last ) ) { - ber_scanf( ber, "x" ); - } - return rc; + ssa.sa_desc = slap_bv2tmp_ad( &desc, op->o_tmpmemctx ); } } @@ -449,6 +471,8 @@ return_error: (long) rc, 0, 0 ); slap_sl_free( ssa.sa_initial.bv_val, op->o_tmpmemctx ); ber_bvarray_free_x( ssa.sa_any, op->o_tmpmemctx ); + if ( ssa.sa_desc->ad_flags & SLAP_DESC_TEMPORARY ) + op->o_tmpfree( ssa.sa_desc, op->o_tmpmemctx ); slap_sl_free( ssa.sa_final.bv_val, op->o_tmpmemctx ); return rc; } @@ -495,6 +519,8 @@ filter_free_x( Operation *op, Filter *f ) if ( f->f_sub_final.bv_val != NULL ) { op->o_tmpfree( f->f_sub_final.bv_val, op->o_tmpmemctx ); } + if ( f->f_sub->sa_desc->ad_flags & SLAP_DESC_TEMPORARY ) + op->o_tmpfree( f->f_sub->sa_desc, op->o_tmpmemctx ); op->o_tmpfree( f->f_sub, op->o_tmpmemctx ); break; @@ -615,16 +641,16 @@ simple: len = fstr->bv_len; filter_escape_value_x( &f->f_sub_initial, &tmp, op->o_tmpmemctx ); - tmplen = tmp.bv_len ? tmp.bv_len : STRLENOF( "(null)" ); + tmplen = tmp.bv_len; fstr->bv_len += tmplen; fstr->bv_val = op->o_tmprealloc( fstr->bv_val, fstr->bv_len + 1, op->o_tmpmemctx ); - snprintf( &fstr->bv_val[len-2], + snprintf( &fstr->bv_val[len - 2], tmplen + STRLENOF( /*(*/ "*)" ) + 1, /* "(attr=" */ "%s*)", - tmp.bv_len ? tmp.bv_val : "(null)"); + tmp.bv_len ? tmp.bv_val : ""); ber_memfree_x( tmp.bv_val, op->o_tmpmemctx ); } @@ -636,16 +662,16 @@ simple: len = fstr->bv_len; filter_escape_value_x( &f->f_sub_any[i], &tmp, op->o_tmpmemctx ); - tmplen = tmp.bv_len ? tmp.bv_len : STRLENOF( "(null)" ); + tmplen = tmp.bv_len; fstr->bv_len += tmplen + STRLENOF( /*(*/ ")" ); fstr->bv_val = op->o_tmprealloc( fstr->bv_val, fstr->bv_len + 1, op->o_tmpmemctx ); - snprintf( &fstr->bv_val[len-1], + snprintf( &fstr->bv_val[len - 1], tmplen + STRLENOF( /*(*/ "*)" ) + 1, /* "(attr=[init]*[any*]" */ "%s*)", - tmp.bv_len ? tmp.bv_val : "(null)"); + tmp.bv_len ? tmp.bv_val : ""); ber_memfree_x( tmp.bv_val, op->o_tmpmemctx ); } } @@ -656,16 +682,16 @@ simple: len = fstr->bv_len; filter_escape_value_x( &f->f_sub_final, &tmp, op->o_tmpmemctx ); - tmplen = tmp.bv_len ? tmp.bv_len : STRLENOF( "(null)" ); + tmplen = tmp.bv_len; fstr->bv_len += tmplen; fstr->bv_val = op->o_tmprealloc( fstr->bv_val, fstr->bv_len + 1, op->o_tmpmemctx ); - snprintf( &fstr->bv_val[len-1], + snprintf( &fstr->bv_val[len - 1], tmplen + STRLENOF( /*(*/ ")" ) + 1, /* "(attr=[init*][any*]" */ "%s)", - tmp.bv_len ? tmp.bv_val : "(null)"); + tmp.bv_len ? tmp.bv_val : ""); ber_memfree_x( tmp.bv_val, op->o_tmpmemctx ); } @@ -804,7 +830,10 @@ filter_dup( Filter *f, void *memctx ) n->f_result = f->f_result; break; case LDAP_FILTER_PRESENT: - n->f_desc = f->f_desc; + if ( f->f_desc->ad_flags & SLAP_DESC_TEMPORARY ) + n->f_desc = slap_bv2tmp_ad( &f->f_desc->ad_cname, memctx ); + else + n->f_desc = f->f_desc; break; case LDAP_FILTER_EQUALITY: case LDAP_FILTER_GE: @@ -813,11 +842,16 @@ filter_dup( Filter *f, void *memctx ) /* Should this be ava_dup() ? */ n->f_ava = mf->bmf_calloc( 1, sizeof(AttributeAssertion), memctx ); *n->f_ava = *f->f_ava; + if ( f->f_av_desc->ad_flags & SLAP_DESC_TEMPORARY ) + n->f_av_desc = slap_bv2tmp_ad( &f->f_av_desc->ad_cname, memctx ); ber_dupbv_x( &n->f_av_value, &f->f_av_value, memctx ); break; case LDAP_FILTER_SUBSTRINGS: n->f_sub = mf->bmf_calloc( 1, sizeof(SubstringsAssertion), memctx ); - n->f_sub_desc = f->f_sub_desc; + if ( f->f_sub_desc->ad_flags & SLAP_DESC_TEMPORARY ) + n->f_sub_desc = slap_bv2tmp_ad( &f->f_sub_desc->ad_cname, memctx ); + else + n->f_sub_desc = f->f_sub_desc; if ( !BER_BVISNULL( &f->f_sub_initial )) ber_dupbv_x( &n->f_sub_initial, &f->f_sub_initial, memctx ); if ( f->f_sub_any ) { @@ -841,6 +875,8 @@ filter_dup( Filter *f, void *memctx ) length += f->f_mr_rule_text.bv_len + 1; n->f_mra = mf->bmf_calloc( 1, length, memctx ); *n->f_mra = *f->f_mra; + if ( f->f_mr_desc && ( f->f_sub_desc->ad_flags & SLAP_DESC_TEMPORARY )) + n->f_mr_desc = slap_bv2tmp_ad( &f->f_mr_desc->ad_cname, memctx ); ber_dupbv_x( &n->f_mr_value, &f->f_mr_value, memctx ); if ( !BER_BVISNULL( &f->f_mr_rule_text )) { n->f_mr_rule_text.bv_val = (char *)(n->f_mra+1); @@ -988,7 +1024,7 @@ get_simple_vrFilter( } if ( err == LDAP_SUCCESS ) { - *filt = ch_malloc( sizeof vrf ); + *filt = op->o_tmpalloc( sizeof vrf, op->o_tmpmemctx ); **filt = vrf; } @@ -1157,13 +1193,14 @@ simple_vrFilter2bv( Operation *op, ValuesReturnFilter *vrf, struct berval *fstr { struct berval tmp; ber_len_t len; + int undef; if ( vrf == NULL ) { ber_str2bv_x( "No filter!", STRLENOF("No filter!"), 1, fstr, op->o_tmpmemctx ); return; } - int undef = vrf->vrf_choice & SLAPD_FILTER_UNDEFINED; + undef = vrf->vrf_choice & SLAPD_FILTER_UNDEFINED; switch ( vrf->vrf_choice & SLAPD_FILTER_MASK ) { case LDAP_FILTER_EQUALITY: