X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=servers%2Fslapd%2Fava.c;h=e0fdd8bb2e8decf242ae5c381d37f9d9d83996f9;hb=c67781d0ea7095ada94326f60325159976db18bb;hp=5bc0ec3d6b764d8d4449070b11b6f86e24f4336c;hpb=e9b1012fb1e572ea93b355f15c946b8b431e0160;p=openldap diff --git a/servers/slapd/ava.c b/servers/slapd/ava.c index 5bc0ec3d6b..e0fdd8bb2e 100644 --- a/servers/slapd/ava.c +++ b/servers/slapd/ava.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* ava.c - routines for dealing with attribute value assertions */ @@ -14,35 +14,64 @@ #include "slap.h" + +void +ava_free( + AttributeAssertion *ava, + int freeit +) +{ + free( ava->aa_value.bv_val ); + if ( freeit ) { + ch_free( (char *) ava ); + } +} + int get_ava( BerElement *ber, - Ava *ava + AttributeAssertion **ava, + unsigned usage, + const char **text ) { - if ( ber_scanf( ber, "{ao}", &ava->ava_type, &ava->ava_value ) - == LBER_ERROR ) { + int rc; + ber_tag_t rtag; + struct berval type, value; + AttributeAssertion *aa; + + rtag = ber_scanf( ber, "{mm}", &type, &value ); + + if( rtag == LBER_ERROR ) { +#ifdef NEW_LOGGING + LDAP_LOG( FILTER, ERR, "get_ava: ber_scanf failure\n", 0, 0, 0 ); +#else Debug( LDAP_DEBUG_ANY, " get_ava ber_scanf\n", 0, 0, 0 ); - return( -1 ); - } - attr_normalize( ava->ava_type ); -#ifdef SLAPD_SCHEMA_COMPAT - value_normalize( ava->ava_value.bv_val, attr_syntax( ava->ava_type ) ); #endif + *text = "Error decoding attribute value assertion"; + return SLAPD_DISCONNECT; + } - return( LDAP_SUCCESS ); -} + aa = ch_malloc( sizeof( AttributeAssertion ) ); + aa->aa_desc = NULL; + aa->aa_value.bv_val = NULL; -void -ava_free( - Ava *ava, - int freeit -) -{ - free( (char *) ava->ava_type ); - free( (char *) ava->ava_value.bv_val ); - if ( freeit ) { - free( (char *) ava ); + rc = slap_bv2ad( &type, &aa->aa_desc, text ); + + if( rc != LDAP_SUCCESS ) { + ch_free( aa ); + return rc; } -} + rc = value_validate_normalize( aa->aa_desc, usage, + &value, &aa->aa_value, text ); + + if( rc != LDAP_SUCCESS ) { + ch_free( aa ); + return rc; + } + + *ava = aa; + + return LDAP_SUCCESS; +}