X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Ffilter.c;h=fba7bd3794397d784ff6ded3d5b220abf4814bb3;hb=7fe91339dfd08d6c4168c8493f5c1f0faca6ba54;hp=c1aa9acbc6be64323212048e0e46e02c9d0968c0;hpb=03dbc30deb6c0d68f37f68a22fb46442d687b654;p=openldap diff --git a/servers/slapd/filter.c b/servers/slapd/filter.c index c1aa9acbc6..fba7bd3794 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-2009 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,6 +32,10 @@ #include #include "slap.h" +#include "lutil.h" + +const Filter *slap_filter_objectClass_pres; +const struct berval *slap_filterstr_objectClass_pres; static int get_filter_list( Operation *op, @@ -56,6 +60,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, @@ -361,6 +385,19 @@ get_ssa( rc = LDAP_PROTOCOL_ERROR; + if ( ssa.sa_desc->ad_type->sat_substr == NULL ) { + for ( tag = ber_first_element( ber, &len, &last ); + tag != LBER_DEFAULT; + tag = ber_next_element( ber, &len, last ) ) + { + /* eat all */ + rc = ber_scanf( ber, "x" ); + } + + rc = LDAP_INVALID_SYNTAX; + goto return_error; + } + for ( tag = ber_first_element( ber, &len, &last ); tag != LBER_DEFAULT; tag = ber_next_element( ber, &len, last ) ) @@ -454,6 +491,7 @@ return_error: return rc; } + *text = NULL; rc = LDAP_SUCCESS; } @@ -467,7 +505,7 @@ return_error: } void -filter_free_x( Operation *op, Filter *f ) +filter_free_x( Operation *op, Filter *f, int freeme ) { Filter *p, *next; @@ -506,7 +544,7 @@ filter_free_x( Operation *op, Filter *f ) case LDAP_FILTER_NOT: for ( p = f->f_list; p != NULL; p = next ) { next = p->f_next; - filter_free_x( op, p ); + filter_free_x( op, p, 1 ); } break; @@ -523,7 +561,9 @@ filter_free_x( Operation *op, Filter *f ) break; } - op->o_tmpfree( f, op->o_tmpmemctx ); + if ( freeme ) { + op->o_tmpfree( f, op->o_tmpmemctx ); + } } void @@ -535,7 +575,7 @@ filter_free( Filter *f ) op.o_hdr = &ohdr; op.o_tmpmemctx = slap_sl_context( f ); op.o_tmpmfuncs = &slap_sl_mfuncs; - filter_free_x( &op, f ); + filter_free_x( &op, f, 1 ); } void @@ -543,7 +583,7 @@ filter2bv_x( Operation *op, Filter *f, struct berval *fstr ) { int i; Filter *p; - struct berval tmp; + struct berval tmp, value; static struct berval ber_bvfalse = BER_BVC( "(?=false)" ), ber_bvtrue = BER_BVC( "(?=true)" ), @@ -582,7 +622,17 @@ filter2bv_x( Operation *op, Filter *f, struct berval *fstr ) sign = "~="; simple: - filter_escape_value_x( &f->f_av_value, &tmp, op->o_tmpmemctx ); + value = f->f_av_value; + if ( f->f_av_desc->ad_type->sat_equality && + !undef && + ( f->f_av_desc->ad_type->sat_equality->smr_usage & SLAP_MR_MUTATION_NORMALIZER )) + { + f->f_av_desc->ad_type->sat_equality->smr_normalize( + (SLAP_MR_DENORMALIZE|SLAP_MR_VALUE_OF_ASSERTION_SYNTAX), + NULL, NULL, &f->f_av_value, &value, op->o_tmpmemctx ); + } + + filter_escape_value_x( &value, &tmp, op->o_tmpmemctx ); /* NOTE: tmp can legitimately be NULL (meaning empty) * since in a Filter values in AVAs are supposed * to have been normalized, meaning that an empty value @@ -598,6 +648,10 @@ simple: f->f_av_desc->ad_cname.bv_val, sign, tmp.bv_len ? tmp.bv_val : "" ); + if ( value.bv_val != f->f_av_value.bv_val ) { + ber_memfree_x( value.bv_val, op->o_tmpmemctx ); + } + ber_memfree_x( tmp.bv_val, op->o_tmpmemctx ); break; @@ -618,16 +672,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 ); } @@ -639,16 +693,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 ); } } @@ -659,16 +713,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 ); } @@ -1001,7 +1055,7 @@ get_simple_vrFilter( } if ( err == LDAP_SUCCESS ) { - *filt = ch_malloc( sizeof vrf ); + *filt = op->o_tmpalloc( sizeof vrf, op->o_tmpmemctx ); **filt = vrf; } @@ -1170,13 +1224,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: