X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fava.c;h=c1bc3bd5cc96afd868c2095fb22fc02a516143bc;hb=7fe91339dfd08d6c4168c8493f5c1f0faca6ba54;hp=d0df3d7c263547e18036666bcf53ecd57060b575;hpb=9d59266e25dbeae63428f55f10588e4a78586b34;p=openldap diff --git a/servers/slapd/ava.c b/servers/slapd/ava.c index d0df3d7c26..c1bc3bd5cc 100644 --- a/servers/slapd/ava.c +++ b/servers/slapd/ava.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2005 The OpenLDAP Foundation. + * Copyright 1998-2009 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,7 +43,13 @@ ava_free( AttributeAssertion *ava, int freeit ) { +#ifdef LDAP_COMP_MATCH + if ( ava->aa_cf && ava->aa_cf->cf_ca->ca_comp_data.cd_mem_op ) + nibble_mem_free ( ava->aa_cf->cf_ca->ca_comp_data.cd_mem_op ); +#endif op->o_tmpfree( ava->aa_value.bv_val, op->o_tmpmemctx ); + if ( ava->aa_desc->ad_flags & SLAP_DESC_TEMPORARY ) + op->o_tmpfree( ava->aa_desc, op->o_tmpmemctx ); if ( freeit ) op->o_tmpfree( (char *) ava, op->o_tmpmemctx ); } @@ -51,7 +57,7 @@ int get_ava( Operation *op, BerElement *ber, - AttributeAssertion **ava, + Filter *f, unsigned usage, const char **text ) { @@ -81,10 +87,19 @@ get_ava( rc = slap_bv2ad( &type, &aa->aa_desc, text ); if( rc != LDAP_SUCCESS ) { - Debug( LDAP_DEBUG_FILTER, - "get_ava: unknown attributeType %s\n", type.bv_val, 0, 0 ); - op->o_tmpfree( aa, op->o_tmpmemctx ); - return rc; + f->f_choice |= SLAPD_FILTER_UNDEFINED; + *text = NULL; + rc = slap_bv2undef_ad( &type, &aa->aa_desc, text, + SLAP_AD_PROXIED|SLAP_AD_NOINSERT ); + + if( rc != LDAP_SUCCESS ) { + Debug( LDAP_DEBUG_FILTER, + "get_ava: unknown attributeType %s\n", type.bv_val, 0, 0 ); + aa->aa_desc = slap_bv2tmp_ad( &type, op->o_tmpmemctx ); + ber_dupbv_x( &aa->aa_value, &value, op->o_tmpmemctx ); + f->f_ava = aa; + return rc; + } } rc = asserted_value_validate_normalize( @@ -92,10 +107,12 @@ get_ava( usage, &value, &aa->aa_value, text, op->o_tmpmemctx ); if( rc != LDAP_SUCCESS ) { + f->f_choice |= SLAPD_FILTER_UNDEFINED; Debug( LDAP_DEBUG_FILTER, "get_ava: illegal value for attributeType %s\n", type.bv_val, 0, 0 ); - op->o_tmpfree( aa, op->o_tmpmemctx ); - return rc; + ber_dupbv_x( &aa->aa_value, &value, op->o_tmpmemctx ); + *text = NULL; + rc = LDAP_SUCCESS; } #ifdef LDAP_COMP_MATCH @@ -111,6 +128,6 @@ get_ava( } } #endif - *ava = aa; + f->f_ava = aa; return LDAP_SUCCESS; }