--- servers/slapd/filter.c 2000/08/30 22:52:56 1.13.4.5 +++ servers/slapd/filter.c 2001/12/07 15:43:18 1.13.4.10 @@ -1,5 +1,5 @@ /* filter.c - routines for parsing and dealing with filters */ -/* $OpenLDAP$ */ +/* $OpenLDAP: pkg/ldap/servers/slapd/filter.c,v 1.13.4.9 2001/08/31 20:24:17 kurt Exp $ */ /* * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file @@ -183,7 +183,12 @@ get_filter( err = slap_bv2ad( &type, &f->f_desc, text ); if( err != LDAP_SUCCESS ) { + /* unrecognized attribute description or other error */ + f->f_choice = SLAPD_FILTER_COMPUTED; + f->f_result = LDAP_COMPARE_FALSE; + *fstr = ch_strdup( "(unrecogized=*)" ); ch_free( type.bv_val ); + err = LDAP_SUCCESS; break; } @@ -257,7 +262,7 @@ get_filter( case LDAP_FILTER_EXT: /* not yet implemented */ Debug( LDAP_DEBUG_ANY, "extensible match not yet implemented.\n", - f->f_choice, 0, 0 ); + 0, 0, 0 ); (void) ber_skip_tag( ber, &len ); f->f_choice = SLAPD_FILTER_COMPUTED; f->f_result = SLAPD_COMPARE_UNDEFINED; @@ -265,7 +270,7 @@ get_filter( break; default: - (void) ber_skip_tag( ber, &len ); + (void) ber_scanf( ber, "x" ); /* skip the element */ Debug( LDAP_DEBUG_ANY, "get_filter: unknown filter type=%lu\n", f->f_choice, 0, 0 ); f->f_choice = SLAPD_FILTER_COMPUTED; @@ -443,7 +448,10 @@ get_substring_filter( switch ( tag ) { case LDAP_SUBSTRING_INITIAL: Debug( LDAP_DEBUG_FILTER, " INITIAL\n", 0, 0, 0 ); - if ( f->f_sub_initial != NULL ) { + if ( f->f_sub_initial != NULL + || f->f_sub_any != NULL + || f->f_sub_final != NULL ) + { ber_bvfree( value ); goto return_error; } @@ -461,6 +469,12 @@ get_substring_filter( case LDAP_SUBSTRING_ANY: Debug( LDAP_DEBUG_FILTER, " ANY\n", 0, 0, 0 ); + + if ( f->f_sub_final != NULL ) { + ber_bvfree( value ); + goto return_error; + } + if( ber_bvecadd( &f->f_sub_any, value ) < 0 ) { ber_bvfree( value ); goto return_error; @@ -478,10 +492,12 @@ get_substring_filter( case LDAP_SUBSTRING_FINAL: Debug( LDAP_DEBUG_FILTER, " FINAL\n", 0, 0, 0 ); + if ( f->f_sub_final != NULL ) { ber_bvfree( value ); goto return_error; } + f->f_sub_final = value; if( fstr ) { @@ -561,6 +577,7 @@ filter_free( Filter *f ) if ( f->f_sub_final != NULL ) { ber_bvfree( f->f_sub_final ); } + ch_free( f->f_sub ); break; case LDAP_FILTER_AND: