X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Ffilter.c;h=fba7bd3794397d784ff6ded3d5b220abf4814bb3;hb=7fe91339dfd08d6c4168c8493f5c1f0faca6ba54;hp=d3ceb0b8a8c78d43e9db15c133e6f509daf2d4d4;hpb=d130b7422f4001e0dea0fa5e55cb799557f1923c;p=openldap diff --git a/servers/slapd/filter.c b/servers/slapd/filter.c index d3ceb0b8a8..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-2007 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;