X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fava.c;h=49288ddd19512bd4812c3a836aba0d6af0266753;hb=703531fe5c39e839b74dfbb6760dd8f39dac56b3;hp=5493cb2be3fd15355697259d225a3527a0631840;hpb=c689e1cb74dea866810592a9bcbfdc2c8ae8954b;p=openldap diff --git a/servers/slapd/ava.c b/servers/slapd/ava.c index 5493cb2be3..49288ddd19 100644 --- a/servers/slapd/ava.c +++ b/servers/slapd/ava.c @@ -1,9 +1,28 @@ +/* ava.c - routines for dealing with attribute value assertions */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2012 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Portions Copyright (c) 1995 Regents of the University of Michigan. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Michigan at Ann Arbor. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. */ -/* ava.c - routines for dealing with attribute value assertions */ #include "portable.h" @@ -14,88 +33,101 @@ #include "slap.h" -#ifdef SLAPD_SCHEMA_NOT_COMPAT +#ifdef LDAP_COMP_MATCH +#include "component.h" +#endif void ava_free( - AttributeAssertion *ava, - int freeit -) + Operation *op, + AttributeAssertion *ava, + int freeit ) { - ad_free( ava->aa_desc, 1 ); - ber_bvfree( ava->aa_value ); - if ( freeit ) { - ch_free( (char *) ava ); - } +#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 ); } int get_ava( - BerElement *ber, - AttributeAssertion **ava -) + Operation *op, + BerElement *ber, + Filter *f, + unsigned usage, + const char **text ) { int rc; - char *text; - struct berval type, *value; + ber_tag_t rtag; + struct berval type, value; AttributeAssertion *aa; +#ifdef LDAP_COMP_MATCH + AttributeAliasing* a_alias = NULL; +#endif - rc = ber_scanf( ber, "{oO}", &type, &value ); + rtag = ber_scanf( ber, "{mm}", &type, &value ); - if( rc == LBER_ERROR ) { + if( rtag == LBER_ERROR ) { Debug( LDAP_DEBUG_ANY, " get_ava ber_scanf\n", 0, 0, 0 ); + *text = "Error decoding attribute value assertion"; return SLAPD_DISCONNECT; } - aa = ch_malloc( sizeof( AttributeAssertion ) ); + aa = op->o_tmpalloc( sizeof( AttributeAssertion ), op->o_tmpmemctx ); aa->aa_desc = NULL; + aa->aa_value.bv_val = NULL; +#ifdef LDAP_COMP_MATCH + aa->aa_cf = NULL; +#endif - rc = slap_bv2ad( &type, &aa->aa_desc, &text ); + rc = slap_bv2ad( &type, &aa->aa_desc, text ); if( rc != LDAP_SUCCESS ) { - ch_free( type.bv_val ); - ber_bvfree( value ); - ch_free( aa ); - 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 LDAP_SUCCESS; + } } - aa->aa_value = value; - *ava = aa; - - return LDAP_SUCCESS; -} + rc = asserted_value_validate_normalize( + aa->aa_desc, ad_mr(aa->aa_desc, usage), + usage, &value, &aa->aa_value, text, op->o_tmpmemctx ); -#else - -void -ava_free( - Ava *ava, - int freeit -) -{ - ch_free( (char *) ava->ava_type ); - ch_free( (char *) ava->ava_value.bv_val ); - if ( freeit ) { - ch_free( (char *) ava ); + 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 ); + ber_dupbv_x( &aa->aa_value, &value, op->o_tmpmemctx ); + *text = NULL; + rc = LDAP_SUCCESS; } -} -int -get_ava( - BerElement *ber, - Ava *ava -) -{ - if ( ber_scanf( ber, "{ao}", &ava->ava_type, &ava->ava_value ) - == LBER_ERROR ) { - Debug( LDAP_DEBUG_ANY, " get_ava ber_scanf\n", 0, 0, 0 ); - return SLAPD_DISCONNECT; +#ifdef LDAP_COMP_MATCH + if( is_aliased_attribute ) { + a_alias = is_aliased_attribute ( aa->aa_desc ); + if ( a_alias ) { + rc = get_aliased_filter_aa ( op, aa, a_alias, text ); + if( rc != LDAP_SUCCESS ) { + Debug( LDAP_DEBUG_FILTER, + "get_ava: Invalid Attribute Aliasing\n", 0, 0, 0 ); + return rc; + } + } } - - attr_normalize( ava->ava_type ); - value_normalize( ava->ava_value.bv_val, attr_syntax( ava->ava_type ) ); - +#endif + f->f_ava = aa; return LDAP_SUCCESS; } - -#endif