]> git.sur5r.net Git - openldap/commitdiff
Fix ITS#2023,2027 ACL filters with substrings.
authorHoward Chu <hyc@openldap.org>
Mon, 26 Aug 2002 12:36:59 +0000 (12:36 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 26 Aug 2002 12:36:59 +0000 (12:36 +0000)
servers/slapd/filter.c
servers/slapd/str2filter.c

index d504c915187e5ca595988597d6777bc26f108602..34b9f590d7d673744938037525a38438a445cb5d 100644 (file)
@@ -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;
 
index e01ce3f3f4640e379bccec8695ad8455c42d95f8..6f6f507ff654bc682daa3c2dc0593b1d931a51a1 100644 (file)
@@ -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 );
 }
 
 /*