From: Howard Chu Date: Mon, 26 Aug 2002 12:36:59 +0000 (+0000) Subject: Fix ITS#2023,2027 ACL filters with substrings. X-Git-Tag: OPENLDAP_REL_ENG_2_0_26~20 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=68fd171c119674e2084419e6e5b9e874c0bf4fb4;p=openldap Fix ITS#2023,2027 ACL filters with substrings. --- diff --git a/servers/slapd/filter.c b/servers/slapd/filter.c index d504c91518..34b9f590d7 100644 --- a/servers/slapd/filter.c +++ b/servers/slapd/filter.c @@ -654,6 +654,7 @@ filter_print( Filter *f ) fprintf( stderr, "%s", escaped.bv_val ); ber_memfree( escaped.bv_val ); + i = 1; } if ( f->f_sub_any != NULL ) { for ( i = 0; f->f_sub_any[i] != NULL; i++ ) { @@ -668,7 +669,9 @@ filter_print( Filter *f ) fprintf( stderr, "*%s", escaped.bv_val ); ber_memfree( escaped.bv_val ); + i = 0; } + if ( i ) fprintf( stderr, "*" ); fprintf( stderr, /*(*/ ")" ); break; diff --git a/servers/slapd/str2filter.c b/servers/slapd/str2filter.c index e01ce3f3f4..6f6f507ff6 100644 --- a/servers/slapd/str2filter.c +++ b/servers/slapd/str2filter.c @@ -238,7 +238,7 @@ static int str2subvals( const char *in, Filter *f ) { char *nextstar, *val, *freeme; - int gotstar; + int gotstar, rc = 0; Debug( LDAP_DEBUG_FILTER, "str2subvals \"%s\"\n", in, 0, 0 ); @@ -248,27 +248,40 @@ str2subvals( const char *in, Filter *f ) gotstar = 0; while ( val && *val ) { - if ( (nextstar = ldap_pvt_find_wildcard( val )) != NULL ) + if ( (nextstar = ldap_pvt_find_wildcard( val )) != NULL ) { + gotstar++; + if ( nextstar == val ) { + /* we got two stars in a row with no val! */ + if ( gotstar > 1 ) { + rc = -1; + break; + } + val++; + continue; + } *nextstar++ = '\0'; + } - ldap_pvt_filter_value_unescape( val ); - - if ( gotstar == 0 ) { - f->f_sub_initial = ber_bvstrdup( val ); + if ( ldap_pvt_filter_value_unescape( val ) < 1 ) { + rc = -1; + break; + } - } else if ( nextstar == NULL ) { + if ( nextstar == NULL ) { f->f_sub_final = ber_bvstrdup( val ); + } else if ( gotstar == 1 ) { + f->f_sub_initial = ber_bvstrdup( val ); + } else { - charray_add( (char ***) &f->f_sub_any, (char *) ber_bvstrdup( val ) ); + ber_bvecadd( &f->f_sub_any, ber_bvstrdup( val ) ); } - gotstar = 1; val = nextstar; } free( freeme ); - return( 0 ); + return( rc ); } /*